java - Apache Spark 使用存储在 Parquet 文件中的数据:是否可以进行第二次排序(好像存在二级索引)?
问题描述
我已经将法国的企业和机构列表存储在 parquet 文件中,它们的密钥是现有公司的标识符(警报器、siret),允许从这些公共和已知 ID 中快速搜索它们。
存储此数据的底层 parquet 文件大小约为 1 GB。
但是在两个用例中,有人在问:
一个城市有哪些企业/机构?
而不是通过他们的 id 搜索他们。
我本可以按 { city_code , siren , siret } 对我以前的 parquet 文件进行排序。但是那样的话,仅凭身份对企业/机构的研究就会变慢……
我无法在搜索时重新排序数据,因此我必须在准备和存储数据时对此进行管理。
目前,我只看到解决方案:
- 创建
enterprises_establishments_by_ids
镶木地板文件, - 创建
enterprises_establishments_by_cities_codes_and_ids
镶木地板文件, - 找到一种方法来检测用户在问什么,然后从最方便的商店读取初始数据:1或2。
但它很笨拙。并将数据存储翻倍至 2 GB。
是否有更好的方法来处理这个问题?
解决方案
您可以city_code
在存储镶木地板文件时对数据框进行分区,就像您只能加载与您想要的城市代码相对应的分区一样。
你可以在存储 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)
推荐阅读
- python - 在python中打印集合的元素
- azure-cosmosdb - Azure Cosmos DB - Gremlin API 将现有集合克隆到另一个集合中
- r - 如何创建一个循环来运行 2 个变量广义回归模型?
- android - 无法解决:com.loopj 当我尝试同步 android studio 时收到此消息。我是 http 异步依赖
- mysql - 在mysql中执行大量操作时的精度损失
- python - Python处理列表/队列中的项目并保存进度
- windows - How to create libjson.lib using makefile on windows?
- svg - 如何在模型中插入图像?
- port - 端口 443 确切用途和描述
- apache-zookeeper - 如何将 Zookeeper 从 3.4.8 升级到 3.4.13?