Sha*_*kar 4 scala function broadcast apache-spark apache-spark-sql
我用于sc.broadcast查找文件以提高性能.
我也发现了一个broadcast在Spark SQL Functions中调用的函数.
两个有什么区别?
哪一个我应该用它来广播参考/查找表?
一个字的答案:
1)org.apache.spark.sql.functions.broadcast()函数是用户提供的,给定sql join的显式提示.
2)sc.broadcast用于广播只读共享变量.
broadcast功能#2的更多细节:这是来自的scala doc
sql/execution/SparkStrategies.scala
这说.
- 广播:如果连接的一侧估计的物理大小小于*用户可配置的[[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
}
Run Code Online (Sandbox Code Playgroud)
如果要在Spark SQL中实现广播连接,则应使用broadcast函数(结合所需的spark.sql.autoBroadcastJoinThreshold配置).它会:
SparkContext.broadcast用于处理本地对象,适用于Spark DataFrames.