Spark中的分区和分桶有什么区别?

nof*_*aki 6 python bucket data-partitioning apache-spark

我尝试优化两个 spark 数据帧之间的连接查询,我们称它们为 df1、df2(在公共列“SaleId”上连接)。df1 非常小(5M),所以我在火花集群的节点之间广播它。df2 非常大(200M 行),因此我尝试通过“SaleId”对其进行存储分区/重新分区。

在 Spark 中,按列对数据进行分区和按列对数据进行分桶有什么区别?

例如:

划分:

df2 = df2.repartition(10, "SaleId")
Run Code Online (Sandbox Code Playgroud)

桶:

df2.write.format('parquet').bucketBy(10, 'SaleId').mode("overwrite").saveAsTable('bucketed_table'))
Run Code Online (Sandbox Code Playgroud)

在每一项技术之后,我都将 df2 与 df1 结合使用。

我无法弄清楚使用哪种技术是正确的。谢谢

the*_*tom 5

重新分区用于在同一个Spark 作业中用作操作的一部分。

bucketBy用于输出,写入。从而避免在下一个Spark 应用程序中改组,通常作为 ETL 的一部分。想想JOIN。见 https://databricks-prod-cloudfront.cloud.databricks.com/public/4027ec902e239c93eaaa8714f173bcfc/4861715144695760/2994977456373837/57013737/57013737/57013737st3 ,这是一个非常好的阅读。虽然目前只能由 Spark 读取 bucketBy 表。