我已将sc.broadcast
用于查找文件以提高性能。
我也知道在Spark SQL Functions中有一个名为broadcast
的函数。
两者之间有什么区别?
我应该用它来广播参考/查找表?
答案 0 :(得分:8)
一个字回答:
1)org.apache.spark.sql.functions.broadcast()
函数是用户提供的,显式提示给定的sql join。
2)sc.broadcast
用于广播只读共享变量。
broadcast
函数#1的更多详细信息:这是来自的scala doc
sql/execution/SparkStrategies.scala
说。
- 广播:如果联接的一侧估计的物理尺寸小于*用户可配置的 [[SQLConf.AUTO_BROADCASTJOIN_THRESHOLD]]阈值*或者如果是 side有明确的广播提示(例如,用户应用了*
[[org.apache.spark.sql.functions.broadcast()]]函数到 DataFrame),然后广播连接的那一边* 另一边将流式传输,没有改组* 执行。如果加入的双方都有资格被广播 那么*- 随机散列连接:如果是单个的平均大小 分区足够小,可以构建哈希*表。
- 排序合并:如果匹配的连接键是可排序的。
- 如果没有连接键,则选择Join实现,优先级如下:
- BroadcastNestedLoopJoin:如果可以广播联接的一方
- CartesianProduct:for Inner join
- 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。
答案 1 :(得分:5)
如果要在Spark SQL中实现广播连接,则应使用broadcast
函数(结合所需的spark.sql.autoBroadcastJoinThreshold
配置)。它会:
SparkContext.broadcast
用于处理本地对象,适用于Spark DataFrames
。