apachespark:是否可以进行第二次排序(好像存在第二个索引)?

oipij1gg  于 2021-07-09  发布在  Spark
关注(0)|答案(1)|浏览(196)

我将法国的企业和机构列表存储在Parquet文件中,它们的密钥是现有公司的标识符(siren,siret),允许从这些公开的和已知的id中快速搜索它们。
存储此数据的底层Parquet文件大小约为1GB。
但是在一个关于二的用例中,有人问:
一个城市的所有企业/机构是什么?
而不是用身份证搜索。
我可以用{city\u code,siren,siret}来排序我以前的Parquet文件。但是,仅凭身份证对企业/机构进行研究的速度将会减慢。。。
我无法在搜索时对数据进行重新排序,因此在准备和存储数据时必须对其进行管理。
目前,我看到的唯一解决方案是:
创建 enterprises_establishments_by_ids Parquet锉刀,
创建 enterprises_establishments_by_cities_codes_and_ids Parquet锉刀,
找到一种方法来检测用户的请求,然后从最方便的存储中读取初始数据:1或2。
但是很笨拙。而且它的数据存储空间翻了一番,达到2GB。
有没有更好的方法来处理这个问题?

qzlgjiam

qzlgjiam1#

你可以用 city_code 在存储parquet文件时,您只能加载与所需城市代码对应的分区。
https://spark.apache.org/docs/3.0.1/api/python/pyspark.sql.html#pyspark.sql.dataframewriter.partitionby
您可以在存储1gbDataframe时尝试这样的操作 enterprises_establishments.write.partitionBy('city_code').parquet('your_path/my_file.parquet')) 当用户请求时,城市中的所有企业/机构是什么? enterprises_establishments_in_city = spark.read.parquet('your_path/my_file.parquet/city_code=wanted_city_code') 但是我认为在你的Dataframe上做一个过滤器不会那么慢 enterprises_establishments_in_city = enterprises_establishments.filter(enterprises_establishments.city_code == wanted_city_code)

相关问题