spark sql中sc.broadcast和broadcast函数的区别

问题描述 投票:3回答:2

我使用sc.broadcast查找文件以提高性能。

我也知道在Spark SQL Functions中有一个名为broadcast的函数。

两个有什么区别?

哪一个我应该用它来广播参考/查找表?

scala function apache-spark apache-spark-sql broadcast
2个回答
5
投票

如果要在Spark SQL中实现广播连接,则应使用broadcast函数(结合所需的spark.sql.autoBroadcastJoinThreshold配置)。它会:

  • 标记广播的关系。
  • 调整SQL执行计划。
  • 当评估输出关系时,它将负责收集数据,广播和应用正确的连接机制。

SparkContext.broadcast用于处理本地对象,适用于Spark DataFrames


8
投票

一个字的答案:

1)org.apache.spark.sql.functions.broadcast()函数是用户提供的,给定sql join的显式提示。

2)sc.broadcast用于广播只读共享变量。


More details about 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 sparkenter image description here

© www.soinside.com 2019 - 2024. All rights reserved.