gpt4 book ai didi

scala - Spark : How to use crossJoin

转载 作者:行者123 更新时间:2023-12-05 00:40:00 26 4
gpt4 key购买 nike

我有两个数据框。 df1 有 100000 行,df2 有 10000 行。我想创建一个 df3 这是两者的交叉连接:

val df3 = df1.crossJoin(df2)

这将产生 10 亿行。试图在本地运行它,但似乎需要很长时间。你觉得可以在本地完成吗?

如果不是,哪种配置可以优化在云上运行它的时间?

最佳答案

首先,我同意 Mpizos Dimitris 的观点,您应该尝试提供所有可能的细节,以获得最佳解决方案。

但以下是一种可能但可能不是有效的方法。

1.Cache & repartition 小 DataFrame df2 。确保通过重新分区数据均匀分布在所有工作人员中,以便您可以使用尽可能多的任务。假设您的集群有 20 个工作人员,每个工作人员有 4 个核心。因此,您总共需要 4 x 20 = 80 个分区。

df2.repartition(80).cache()

2.在 DF2 上执行操作,以便在作业开始之前进行缓存。检查 SparkUI 的存储选项卡以确保产品 DF 缓存已分布在所有节点上。

df2.show(10)

3.暂时禁用广播加入。广播连接不适用于笛卡尔产品,因为工作人员获得了太多广播数据,他们陷入无限的垃圾收集循环并且永远无法完成。请记住在查询完成后重新打开它。您可以设置以下配置来禁用 BC 加入。

spark.sql.autoBroadcastJoinThreshold = 0

4.在不使用连接条件的情况下将 DF1 与 DF2 连接。

val crossJoined = df1.join(df2)

5.在执行之前在DataFrame上运行一个解释计划,以确认你有一个笛卡尔积运算。

crossJoined.explain

关于scala - Spark : How to use crossJoin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51684472/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com