【发布时间】:2017-03-12 06:04:17
【问题描述】:
我使用sc.broadcast 来查找文件以提高性能。
我还了解到 Spark SQL 函数中有一个名为 broadcast 的函数。
两者有什么区别?
我应该使用哪个来广播参考/查找表?
【问题讨论】:
标签: scala function apache-spark apache-spark-sql broadcast
我使用sc.broadcast 来查找文件以提高性能。
我还了解到 Spark SQL 函数中有一个名为 broadcast 的函数。
两者有什么区别?
我应该使用哪个来广播参考/查找表?
【问题讨论】:
标签: scala function apache-spark apache-spark-sql broadcast
如果你想在 Spark SQL 中实现广播连接,你应该使用broadcast 函数(结合所需的spark.sql.autoBroadcastJoinThreshold 配置)。它将:
SparkContext.broadcast用于处理本地对象,适用于SparkDataFrames。
【讨论】:
一句话回答:
1) org.apache.spark.sql.functions.broadcast() 函数是用户提供的,给定 sql 连接的显式提示。
2) sc.broadcast 用于广播只读共享变量。
broadcast函数#1的细节:这是来自的 scala 文档
sql/execution/SparkStrategies.scala
说。
- 广播:如果连接的一侧的估计物理大小小于 * 用户可配置的 [[SQLConf.AUTO_BROADCASTJOIN_THRESHOLD]] 阈值 * 或者如果 side 有一个明确的广播提示(例如,用户应用了 *
[[org.apache.spark.sql.functions.broadcast()]] 函数到一个 DataFrame), 那么join的那一侧*会被广播 另一边将被流式传输,没有洗牌 *
执行。如果加入的双方都有资格被广播 然后 *- Shuffle hash join:如果单个的平均大小 分区足够小,可以构建散列 * 表。
- 排序合并:如果匹配的连接键是可排序的。
- 如果没有加入键,则按照以下优先级选择加入实现:
- BroadcastNestedLoopJoin:如果可以广播连接的一侧
- CartesianProduct:用于内连接
- 广播嵌套循环加入
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。
【讨论】: