Apache spark 我可以在sparkConf中为不同的sql?设置不同的autoBroadcastJoinThreshold值吗;
我有大数据帧:A(200g)、B(20m)、C(15m)、D(10m)、E(12m),我想将它们连接在一起:A连接B、C连接D和E在同一SparkSession中使用SparkSQL**。就像:Apache spark 我可以在sparkConf中为不同的sql?设置不同的autoBroadcastJoinThreshold值吗;,apache-spark,broadcast,skew,Apache Spark,Broadcast,Skew,我有大数据帧:A(200g)、B(20m)、C(15m)、D(10m)、E(12m),我想将它们连接在一起:A连接B、C连接D和E在同一SparkSession中使用SparkSQL**。就像: absql:sql("select * from A a inner join B b on a.id=b.id").write.csv("/path/for/ab") cdesql:sql("select * from C c inner join D d on c.id=d.id inner joi
absql:sql("select * from A a inner join B b on a.id=b.id").write.csv("/path/for/ab")
cdesql:sql("select * from C c inner join D d on c.id=d.id inner join E e on c.id=e.id").write.csv("/path/for/cde")
问题:
当我使用默认值spark.sql.autoBroadcastJoinThreshold=10m时
- absql将花费很长的时间,原因是absql扭曲
- cdesql是正常的
spark.sql.autoBroadcastJoinThreshold=20m时
- C、 D、E将被广播,所有任务将在同一个执行器中执行,这仍然需要很长时间
- 如果set num executors=200,则广播需要很长时间
- absql是正常的
autoBroadcastJoinThreshold
。通过这种方式,很容易决定哪些数据帧应该广播或不广播
在Scala中,它可以如下所示:
import org.apache.spark.sql.functions.broadcast
val B2 = broadcast(B)
B2.createOrReplaceTempView("B")
这里,dataframe B被标记为广播,然后被注册为一个表,与Spark SQL一起使用
或者,这可以直接使用dataframe API完成,第一个连接可以编写为:
A.join(broadcast(B), Seq("id"), "inner")
谢谢@Shaido!这对我很有帮助。在这个问题上@Shaido的答案可以解决我的问题。这让我知道功能
broadcast
不受参数autoBroadcastJoinThreshold