我尝试优化两个spark数据帧之间的联接查询,我们将它们称为df1,df2(在公共列“ SaleId”上联接)。 df1非常小(5M),因此我在Spark集群的节点之间广播了它。 df2非常大(200M行),因此我尝试通过“ SaleId”对其进行存储/重新分区。
在Spark中,按列划分数据和按列存储数据有什么区别?
例如:
分区:
df2 = df2.repartition(10, "SaleId")
存储桶:
df2.write.format('parquet').bucketBy(10, 'SaleId').mode("overwrite").saveAsTable('bucketed_table'))
在每种技术中,我都将df2和df1结合在一起。
我不知道哪种是最合适的技术。 谢谢
答案 0 :(得分:0)
分区 用于在相同 Spark作业中作为Action的一部分。
bucketBy 用于输出,写入。因此,为了避免在 next Spark应用中改组,通常将其作为ETL的一部分。想想JOIN。 看到 https://databricks-prod-cloudfront.cloud.databricks.com/public/4027ec902e239c93eaaa8714f173bcfc/4861715144695760/2994977456373837/5701837197372837/latest.html 简明扼要的阅读。 bucketBy表只能读取 目前由Spark负责。