我使用sc.broadcast
查找文件以提高性能。
我也知道在Spark SQL Functions中有一个名为broadcast
的函数。
两个有什么区别?
哪一个我应该用它来广播参考/查找表?
如果要在Spark SQL中实现广播连接,则应使用broadcast
函数(结合所需的spark.sql.autoBroadcastJoinThreshold
配置)。它会:
SparkContext.broadcast
用于处理本地对象,适用于Spark DataFrames
。
一个字的答案:
1)org.apache.spark.sql.functions.broadcast()
函数是用户提供的,给定sql join的显式提示。
2)sc.broadcast
用于广播只读共享变量。
broadcast
function #1 :这是来自sql/execution/SparkStrategies.scala
的scala doc
这说。
- 广播:如果联接的一侧的估计物理大小小于*用户可配置的[[SQLConf.AUTO_BROADCASTJOIN_THRESHOLD]]阈值*,或者该方具有明确的广播提示(例如,用户应用了* [[org.apache.spark.sql.functions.broadcast()]]函数到一个DataFrame),那么连接的那一边*将被广播,另一边将被流式传输,没有改组* 执行。如果加入的双方都有资格被广播,那么*
- 随机散列连接:如果单个分区的平均大小足够小,可以构建散列*表。
- 排序合并:如果匹配的连接键是可排序的。
- 如果没有连接键,则选择具有以下优先级的连接实现: BroadcastNestedLoopJoin:如果可以广播联接的一侧 CartesianProduct:用于内连接 BroadcastNestedLoopJoin
spark.sql.autoBroadcastJoinThreshold
的大小控制行为,默认情况下为10mb注意:
smallDataFrame.join(largeDataFrame)
不会进行广播散列连接,但largeDataFrame.join(smallDataFrame)
会这样做。
/** Matches a plan whose output should be small enough to be used in broadcast join.
**/
private def canBroadcast(plan: LogicalPlan): Boolean = {
plan.statistics.isBroadcastable ||
plan.statistics.sizeInBytes <= conf.autoBroadcastJoinThreshold
}
在未来的below configurations will be deprecated in coming versions of spark。