Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 我可以在sparkConf中为不同的sql?设置不同的autoBroadcastJoinThreshold值吗;_Apache Spark_Broadcast_Skew - Fatal编程技术网

Apache spark 我可以在sparkConf中为不同的sql?设置不同的autoBroadcastJoinThreshold值吗;

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

我有大数据帧:A(200g)、B(20m)、C(15m)、D(10m)、E(12m),我想将它们连接在一起:A连接BC连接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 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