Spark千万级企业编码数据分区方案选型及排序优化咨询
分区内排序字段选择建议
直接选择(siren, siret)作为sortWithinPartitions的排序字段即可,无需加入partitionSiren,原因如下:
- 分区内partitionSiren值无差异:数据已经按
partitionSiren完成分区,每个分区内所有数据的partitionSiren字段值完全一致,在分区内排序时重复加入该字段属于冗余操作,只会额外增加排序计算开销,对查询效率毫无增益。 - 匹配查询过滤逻辑:针对你通过
partitionSiren、siren、siret过滤数据的场景:- Spark会先通过
partitionSiren快速定位目标分区,无需在分区内再基于该字段筛选; - 分区内按
siren, siret排序后,相同siren的企业数据会集中存储,下属机构的siret也按顺序排列,不管是查询某个siren对应的全量企业数据,还是精准查询某个siret的下属机构数据,都能快速定位到目标数据段,大幅缩小扫描范围。
- Spark会先通过
- 保持性能优势:你测试的方案3(自定义分区列+repartition+sortWithinPartitions)耗时更短,核心原因是
sortWithinPartitions仅做分区内排序,远比重做全局排序的orderBy代价更低;选择siren, siret作为排序字段能进一步维持这个性能优势,避免冗余排序拖慢处理速度。
内容的提问来源于stack exchange,提问作者Marc Le Bihan
相关产品推荐
相关产品推荐

