spark三种实现map端join的方式:闭包、广播、缓存文件

文章探讨了在Spark中,如何通过map端join和使用广播变量来优化实体数据与字典数据的关联操作,以避免shuffle并提高效率。广播变量在传输效率上优于闭包,尤其在处理大数据量时,且广播变量为只读,而闭包可以在task内部修改但仅对当前task生效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spark中map端join

实体数据与字典数据进行关联时,我们可以用闭包或者广播变量或者字典文件,将字典数据发送到每个task,不采用join的方式以此来减少shuffer提高效率。

// shuffer,reduce端join
data.join(obj).map(joined=>{
   obj
})
// map端join
// 缓存文件
sc.addFile("/usr/data/dict.data")
data.map(dt=>{
  val br = new BufferedReader("dict.data")   
})
// 闭包引用
val obj = new RDD()
data.map(dt=>{
   obj
})
// 广播变量引用
val obj = new RDD()
val btobj=sc.broadcast(obj)
data.map(dt=>{
  btobj.value
})

回顾mapReduce中的缓存文件

}

闭包和广播变量的区别

前者发送数据的时候,采用bitTolerant协议,首先driver将obj序列化后分为多份,然后某个task获取到一部分之后就可以作为服务器发给另外的task。因此效率高

后者每个task的obj数据都有driver端序列化后发送过来的

结论1:广播变量传输的效率要高于闭包引用,尤其是obj数据比较大时效果明显。

结论2:task获取到广播变量的数据是只读的不能修改,闭包是可以修改的,但是也只有在自己的task进程中才有效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值