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

时间:2016-10-29 15:05:59

标签: scala function apache-spark apache-spark-sql broadcast

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

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

两者之间有什么区别?

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

2 个答案:

答案 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 sparkenter image description here

答案 1 :(得分:5)

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

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

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