我正在尝试在两个表上进行广播连接。较小表的大小将因参数而异,但较大表的大小接近2TB。
我注意到的是,如果我没有将spark.sql.autoBroadcastJoinThreshold
设置为10G,则其中某些操作将执行SortMergeJoin
而不是广播联接。但是,较小的表的大小根本不应该太大。我将较小的表写入了s3文件夹,仅占用了12.6 MB的空间。
我在较小的表上进行了一些操作,因此混洗大小出现在Spark History Server上,并且内存大小似乎为150 MB,远不及10G。另外,如果我在较小的表上强制执行广播联接,则广播会花费很长时间,这使我认为表的大小可能不只是150 MB。
什么是弄清楚Spark正在查看的实际大小并确定其是否超过spark.sql.autoBroadcastJoinThreshold
定义的值的好方法?
答案 0 :(得分:0)
查看spark UI中的“ SQL”选项卡。在那里,您将看到每个作业的DAG + spark收集的统计信息。
对于每个数据框,它将包含火花看到的大小。
顺便说一句,您没有将spark.sql.autoBroadcastJoinThreshold
设置为较高的数字以使用广播联接强制触发火花。
您可以简单地将小df
与org.apache.spark.sql.functions.broadcast(df)
包装在一起,它将仅在该特定联接上强制广播
答案 1 :(得分:0)
如该问题所述:DataFrame join optimization - Broadcast Hash Join
import org.apache.spark.sql.functions.broadcast
val employeesDF = employeesRDD.toDF
val departmentsDF = departmentsRDD.toDF
// materializing the department data
val tmpDepartments = broadcast(departmentsDF.as("departments"))
import context.implicits._
employeesDF.join(broadcast(tmpDepartments),
$"depId" === $"id", // join by employees.depID == departments.id
"inner").show()