在数据集不平衡的情况下加入优化
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 步骤。但是做一次,然后你可以重复使用它很多次。
我还有两个集合要加入:
数据集 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 步骤。但是做一次,然后你可以重复使用它很多次。