join,将两张表通过某个共同的key整合起来。
这篇文章为已经学习过join功能的人准备,请看下边几个问题:
1,为什么在join时候需要获取文件的文件名来区分出数据究竟来源于哪个文件,有没有别的方式来对map获取的数据的所属进行区分。
hadoop默认使用FileInputFormat来读入磁盘数据,这个类的切片策略是按照设置的split size切片,同时对每个新文件不管上个文件最后一段数据是否打到split size ,都会重新开一个split。
对于小文件达不到128M基本就是一个文件一个split,所以我们可以简单的通过获得context中获得FileSplit对象,然后再通过他的方法获得split的对应的文件的name。
实际上,MapTesk以split作为单位,处理数据,如果有3个split 一个maptesk, 三个split都会进入这个maptesk中的map方法,又因为上边的论述,不同split来着与不同文件,他们除了文件名这个便于区分彼此的特征,我们也能找到其他的特征,比如,不同文件数据长度等,不使用文件名我们依然可以在map阶段区分出来自不同文件的数据。
2,为什么要将reduce获取的数据先存入一个数据容器,在操作,是否可以通过某种方式,直接在reduce中匹配join的表1和表2并输出数据?
不能,想要在获取一行数据后直接连接两个表,你至少需要得到两个表中的其中一个的完整数据,这样才可以针对另一个表输入的每一行去进行外键查找匹配,但是reduce每次获得的数据都是两个表的各自一部分,所以我们需要自己把得到的数据整理完整。
另一个重要原因是,reduce的键值对的值,是一个迭代数据,我们一般1通过迭代器获得其中内容,而迭代器不允许直接
3,reduce的数据容器设置在reduce()方法内还是方法外?
我们的数据容器很显然是只需要存着一次reduce方法的数据,所以放入reduce内部就可以了。