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

Sha*_*kar 4 scala function broadcast apache-spark apache-spark-sql

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

我也发现了一个broadcast在Spark SQL Functions中调用的函数.

两个有什么区别?

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

Ram*_*ram 9

一个字的答案:

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版本中弃用. 在此输入图像描述


use*_*411 6

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

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

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