前言
我们知道hive,mysql等sql语言都可以进行join操作。那么mapreduce是如何join的呢?
在说明mapreduce进行join开始,我们来先看看sql的语法。
前言
我们知道hive,mysql等sql语言都可以进行join操作。那么mapreduce是如何join的呢?
在说明mapreduce进行join开始,我们来先看看sql的语法。
|
|
两张表关联在一起,需要什么数据,就从不同的表中取出数据即可。
mapreduce如何JOIN
通过前面的铺垫,我们知道sql进行表关联是多么的简单。那么通过程序如何进行关联呢?
我们hive的数据是不是从HDFS上来的,HDFS上是不是文件数据。那么我们可以把表数据看成是一个文件。
那么两张表可不可以看成两个文件,hive也是拿到这两个文件进行关联的。
现在如果不使用MR进行计算,写一个程序来进行连接呢?
文件A假设1GB,文件B500MB。
此时,我么可以把文件B读入到内存之中。
文件B的数据结构:
然后一行一行读取文件A的数据,判断key是否存在,如果存在,则把文件A的值+List的值遍历输出
是不是也可以得到呢。
上面的数据可以放置在内存中,我觉得挺合理的,应为单机能处理的数据表示数据量普遍不算很大。
但是,如果说你现在的数据有1T呢?还有可能放置在内存中吗?
我看过大部分博客内容,大部分都是相同的写法如下:
|
|
这种写法对吗,是对的。但是有没有更好的,有。(稍后让你看,😏😏😏😏)
但是,我么通常也会遇到数据倾斜的问题,可能是某一组值特别的大,那么如果在JOIN的时候
也遇到了特别多相同的key值,那么内存还放得下吗?
不过这位使用LinkedList也是非常不错的,插入删除速度也是优于ArrayList(点个赞)。
好了,说了这么多。你真的能比这些人的内容写的好的吗?不会再吹牛吧(尴尬表情)
来说说我如何去做。
自定义key值之后,由于我不是放入内存的,所以字段输出的顺序可能是有点问题的
所以还要进行二次排序,到reduce的时候一组数据已经在一起了,我么设置一个boolean值
在第一次遍历值的时候不写入文件中,而是记录在一个字符串,然后第二次boolean更改后
把上一次和这一次的值一起写入。
来看看代码吧:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
测试数据:
l.txt
r.txt
以下是输出结果:
以上程序作为内联展示给了大家,如果对文章内容有疑问,或者有更好的建议,又或者有土豪打赏
都不要吝啬。谢谢!
还不错的文章链接
http://codingjunkie.net/mapreduce-reduce-joins/
https://www.safaribooksonline.com/library/view/data-algorithms/9781491906170/ch01.html
https://chamibuddhika.wordpress.com/2012/02/26/joins-with-map-reduce/
方便后人,方便自己!!!