【问题标题】:Difference between sc.broadcast and broadcast function in spark sqlspark sql中sc.broadcast和broadcast函数的区别
【发布时间】:2017-03-12 06:04:17
【问题描述】:

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

我还了解到 Spark SQL 函数中有一个名为 broadcast 的函数。

两者有什么区别?

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      一句话回答:

      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

      【讨论】:

      • @BdEngineer :广播变量是从局部变量中读取数据,而不是像数据集/数据帧这样的分布式结构。就是杰克克所说的。这是 100% 正确的
      猜你喜欢
      • 1970-01-01
      • 2019-11-05
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 2017-03-28
      • 2020-10-11
      • 1970-01-01
      • 2017-10-05
      相关资源
      最近更新 更多