spark中join不产生shuffle的操作方式

(注:来源,spark大数据商业实战三部曲)

在大数据处理场景中,多表join是常见的一类运算。为了便于求解,通常会将多表Join问题转为多个两表连接的问题。两表Join的实现算法非常多,一般我们会根据两表的数据特点选取不同的Join算法,其中,最常用的两个算法是map-side join和reduce-side join。map-side join也就是join不产生shuffle。

Map-side join使用场景是一个大表和一个小表的连接操作。小表的定义为:可加载到内存的表。该算法将Join算子执行在Mapper端,无需经理Shuffle和reduce等阶段,因此效率非常高。

实现时,首先将小表广播到各个Executor上,然后通过map对大表的每条记录查找是否在小表中,在则输出,否则跳过。

#scala实现
#table1 小表
#table2 大表
var table1 = sc.textFile(args(1))
var table2 = sc.textFile(args(2))

var pairs = table1.map{ x =>
var pos = x.indexOf(',')
    (x.substring(0,pos),x.substring(pos+1))
}.collectAsMap
var broadCastMap = sc.broadcast(pairs)

var result = table2.map { x=>
    var pos = x.indexOf(',')(
    (x.substring(0,pos),x.substring(pos+1))
}.mapPartitions({ iter =>
var m = broadCastMap.value
for {
    (key,value) <- iter 
if (m.contains(key))
} yield (key,(values,m.get(key).getOrElse("")))
})

result.saveAsTextFile(args(3))

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值