首页 > 解决方案 > Apache Spark 使用存储在 Parquet 文件中的数据:是否可以进行第二次排序(好像存在二级索引)?

问题描述

我已经将法国的企业和机构列表存储在 parquet 文件中,它们的密钥是现有公司的标识符(警报器siret),允许从这些公共和已知 ID 中快速搜索它们。
存储此数据的底层 parquet 文件大小约为 1 GB。

但是在两个用例中,有人在问:

一个城市有哪些企业/机构?

而不是通过他们的 id 搜索他们。

我本可以按 { city_code , siren , siret } 对我以前的 parquet 文件进行排序。但是那样的话,仅凭身份对企业/机构的研究就会变慢……

我无法在搜索时重新排序数据,因此我必须在准备和存储数据时对此进行管理。

目前,我只看到解决方案:

  1. 创建enterprises_establishments_by_ids镶木地板文件,
  2. 创建enterprises_establishments_by_cities_codes_and_ids镶木地板文件,
  3. 找到一种方法来检测用户在问什么,然后从最方便的商店读取初始数据:12

但它很笨拙。并将数据存储翻倍至 2 GB。
是否有更好的方法来处理这个问题?

标签: javaapache-sparkparquet

解决方案


您可以city_code在存储镶木地板文件时对数据框进行分区,就像您只能加载与您想要的城市代码相对应的分区一样。

https://spark.apache.org/docs/3.0.1/api/python/pyspark.sql.html#pyspark.sql.DataFrameWriter.partitionBy

你可以在存储 1GB 数据帧时尝试这样的事情

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')

但我认为对您的数据框进行过滤不会那么慢

enterprises_establishments_in_city = enterprises_establishments.filter(enterprises_establishments.city_code == wanted_city_code)


推荐阅读