Spark_使用broadcast避免Join出现笛卡尔乘积

package com.atguigu.spark

import org.apache.spark.broadcast.Broadcast
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

import scala.collection.mutable

object TestBroadCast {
def main(args: Array[String]): Unit = {
//1.使用开发工具完成wordcount 创建sc
//1.创建配置文件
val conf = new SparkConf().setMaster(“local[7]”).setAppName(“MyWordCount”)

val sc = new SparkContext(conf)
val rdd1 = sc.makeRDD(List(("a",1),("c",2),("b",2)))
val rdd2 = sc.makeRDD(List(("b",1),("a",2),("c",2)))
//rdd1.join(rdd2)
val map = mutable.Map(("b",1),("a",2),("c",2))
val bc: Broadcast[mutable.Map[String, Int]] = sc.broadcast(map)
rdd1.map{
  case (w,c)=> {
    bc.value.getOrElse(w, 0)
    (w,(c,1))
  }
}.collect().foreach(print)

}
}

### Spark SQL Broadcast Join使用方法及示例 #### 什么是 Broadcast JoinBroadcast Join 是一种优化技术,在 Spark SQL 中用于处理较小的表参与 Join 操作的情况。当一张表非常小时,可以将其广播到集群中的每个节点上,而不是通过 Shuffle 来分发数据[^1]。 #### 配置参数说明 以下是与 Broadcast Join 相关的关键配置参数及其作用: - **`spark.sql.autoBroadcastJoinThreshold`**: 控制小表自动广播的阈值(单位为字节)。默认值为 `10MB` (即 `10485760`)。如果设置为 `-1`,则禁用自动广播功能。 - **`spark.sql.broadcastTimeout`**: 设置广播操作的最大等待时间(单位为毫秒),超过该时间会抛出异常。默认值通常为 `300 秒` 或者更长时间。 - **`spark.sql.adaptive.autoBroadcastJoinThreshold`**: 自适应执行框架下的广播阈值。此参数允许动态调整广播行为,适用于复杂场景下进一步提升性能[^1]。 #### 示例代码 下面是一个完整的例子展示如何手动启用 Broadcast Join 和其实际应用方式: ```scala import org.apache.spark.sql.functions._ // 假设有两个 DataFrame A 和 B val dfA = spark.read.format("csv").option("header", "true").load("/path/to/large_table.csv") val dfB = spark.read.format("csv").option("header", "true").load("/path/to/small_table.csv") // 手动指定广播提示 dfA.join(broadcast(dfB), Seq("key"), "inner") .show() // 如果希望完全依赖系统判断,则可以通过修改配置来实现自动化 spark.conf.set("spark.sql.autoBroadcastJoinThreshold", "10485760") // 单位为字节数 ``` 在此案例中,我们假设 `dfB` 表格大小远小于设定好的广播上限,因此适合采用广播机制加速计算过程;而较大的表格保持不变继续走常规路径完成关联运算逻辑[^2]。 另外需要注意的是,并非所有的连接类型都支持广播模式。例如左外联接(`LEFT OUTER JOIN`)只允许右侧关系作为候选对象进行广播传输[^2]。 最后提醒一点关于分区数量的影响因素——`spark.sql.shuffle.partitions` 参数决定了整个作业过程中产生的 shuffle 文件数目多少,间接也会影响到最终结果集生成效率问题所在之处[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值