在数据集不平衡的情况下加入优化



我有两个集合要LEFT连接:

数据集A:约10000个镶木地板文件,每个文件300 KB

数据集B:约50000个镶木地板文件,每个文件30 MB

我想加入两个数据集中常见的字符串列,比如"name"。

一件重要的事情是数据集A中的每一行在数据集B中都有一个匹配项。但数据集B包含许多其他行。

通常的联接函数需要很长时间,在大多数情况下都会失败。所以我在问是否可以进行优化?例如,在"名称"列上按字母顺序划分数据集B是个好主意吗?广播联接将不起作用,因为数据集A不够小。

如果您可以在加入之前对文件进行bucketize,那可能会更好。否则,您还需要一个书写步骤才能使用桶装。

df_A.write.format('parquet')
...     .bucketBy(10, 'name')
...     .mode("overwrite")
...     .saveAsTable('bucketed_table_A'))
df_B.write.format('parquet')
...     .bucketBy(10, 'name')
...     .mode("overwrite")
...     .saveAsTable('bucketed_table_B'))

Bucketing允许您对数据进行预混洗。datarama_A和datarama_B都应该具有相同数量的bucket。铲斗数量的选择是一门困难的"艺术",取决于您的数据和配置。

然后,你读取你的区块化数据,并在"名称"上加入它们。

spark.table('bucketed_table_A').join(
spark.table('bucketed_table_B'),
on='name',
how='left'
)

这样做,您就可以将计算时间从联接步骤转移到写入/backetize步骤。但是只要做一次,就可以重复使用多次。

最新更新