(注:来源,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))