今天在使用hadoop时遇到一个需求,要将具有一定关系的若干个大表进行合并join,乍看起来比较困难。但是仔细分析了一下,还是可以比较好的解决问题的。况且在海量数据处理中,这是一个非常普遍常见的需求。因此写下来和大家分享一下。如果哪为仁兄看后有更好的办法,咱们也可以切磋一下。欢迎拍砖,哈哈。
下面描述一下需求,有如下两种数据
数据A
key value1 value2 value3...valuen
数据B
value1 a1 a2 a3....an
value2 b1 b2 b3....bn
...
valuen x1 x2 x3...xn
目标数据
key value1 a1 a2 a3...an value2 b1 b2 b3...bn....valuen x1 x2 x3...xn
也就是要把所有的数据集合并在一行。当然,所有的数据都是海量的,上TB的数据,显然无法单机进行合并。于是本人想了个办法,在hadoop集群上使用两轮mapreduce完成,下面附上方法,欢迎拍砖。
第一轮的map
使用valuen做为key,红色为key, 整行数据作为value,即
value1 1 key value1 value2 value3...valuen
value2 1 key value1 value2 value3...valuen
...
valuen 1 key value1 value2 value3...valuen
value1 2 a1 a2 a3....an
value2 2 b1 b2 b3....bn
...
valuen 2 x1 x2 x3...xn
第一轮reduce
经过map阶段,标准输入数据应该是下面的格式。(为什么就不用我说了吧,如果大家不明白,建议先看一下mapreduce的机制,可以参见之前的文章)
value1 1 key value1 value2 value3...valuen
value1 2 a1 a2 a3....an
value2 1 key value1 value2 value3...valuen
value2 2 b1 b2 b3....bn
...
valuen 1 key value1 value2 value3...valuen
valuen 2 x1 x2 x3...xn
进行合并
得到下面的结果
key value1 value2 value3...valuen value1 a1 a2 a3....an
key value1 value2 value3...valuen value2 b1 b2 b3....bn
...
第二轮map
继续以key value1 value2 value3...valuen整行为key,打印输出
key value1 value2 value3...valuen value1 a1 a2 a3....an
key value1 value2 value3...valuen value2 b1 b2 b3....bn
...
第二轮reduce
将上面的结果直接进行合并之后,整理输出格式,就可以得到预期的数据了。
想了很久,本人没有找到更好的方法可以少于2轮map-reduce完成上出过程。特此发表此文,希望高人能够给出建议,谢谢