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

Join optimisation in case of unbalanced datasets

我还有两个集合要加入:

数据集 A:约 10000 个 parquet 文件,每个 300 KB

数据集 B:约 50000 个 parquet 文件,每个 30 MB

我想连接在两个数据集中都很常见的字符串列,比如 "name"。

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

通常的连接函数需要很长时间并且在大多数情况下会失败。所以我问是否可以进行优化?例如,在 "name" 列上按字母顺序对数据集 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'))

分桶允许您预先调整数据。 dataframa_A 和 datafram_B 应该有相同数量的桶。桶数的选择是一个困难 "art" 并且取决于您的数据和您的配置。

然后,您读取分桶数据并在 "name" 上加入它们。

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

这样做,您将计算时间从连接步骤转移到 write/bucketize 步骤。但是做一次,然后你可以重复使用它很多次。