“ 单表关联”这个实例要求从给出的数据中寻找所关心的数据,它是对原始数据所包含信息的挖掘。
“ 单表相关”这个实例要求从给出的数据中寻觅所关怀的数据,它是对原始数据所包括信息的发掘。下面进入这个实例。
1 .实例描绘
实例中给出 child-parent(孩子——爸爸妈妈)表,要求输出 grandchild-grandparent(孙子——爷奶)表。
样例输入如下所示。
file:
宗族树状联系谱:
样例输出如下所示。
file:
2 .规划思路
剖析这个实例,明显需求进行单表衔接,衔接的是左表的 parent 列和右表的 child 列,且左表和右表是同一个表。
衔接成果中除掉衔接的两列便是所需求的成果——“ grandchild–grandparent”表。要用MapReduce 处理这个实例, 首要应该考虑怎么完结表的自衔接; 其次便是衔接列的设置;最终是成果的收拾。
考虑到 MapReduce 的 shuffle 进程会将相同的 key 会衔接在一起,所以能够将 map 成果的 key 设置成待衔接的列,然后列中相同的值就自然会衔接在一起了。再与最开端的剖析联系起来:
要衔接的是左表的 parent 列和右表的 child 列,且左表和右表是同一个表,所以在 map阶段将读入数据分割成 child 和 parent 之后,会将 parent 设置成 key, child 设置成 value进行输出,并作为左表;再将同一对 child 和 parent 中的 child 设置成 key, parent 设置成value 进行输出,作为右表。
为了区别输出中的左右表,需求在输出的 value 中再加上左右表的信息,比如在 value 的 String 最开端处加上字符 1 表明左表,加上字符 2 表明右表。
这样在 map 的成果中就形成了左表和右表,然后在 shuffle 进程中完结衔接。 reduce 接收到衔接的成果,其间每个 key 的 value-list 就包括了“ grandchild–grandparent”联系。
取出每个key 的 value-list 进行解析,将左表中的 child 放入一个数组, 右表中的 parent 放入一个数组,然后对两个数组求笛卡尔积便是最终的成果了。
3 .程序代码
程序代码如下所示。
4 .代码成果
预备测试数据
经过 Eclipse 下面的“ DFS Locations”在“ /user/hadoop”目录下创立输入文件“ STjoin_in”文件夹( 补白:“ STjoin_out”不需求创立。)如图 4.4-1 所示,现已成功创立。
然后在本地树立一个 txt 文件,经过 Eclipse 上传到“ /user/hadoop/STjoin_in”文件夹中,一个 txt 文件的内容如“实例描绘”那个文件相同。如图 4.4-2 所示,成功上传之后。
从 SecureCRT 远处检查“ Master.Hadoop”的也能证明咱们上传的文件,显现其内容如图 4.4-3 所示:
运转详解
( 1) Map 处理:
map 函数输出成果如下所示。
( 2) Shuffle 处理
在 shuffle 进程中完结衔接。
首要由句子“ 0 != grandchildnum && 0 != grandparentnum”得知,只要在“ value-list”中没有左表或许右表,则不会做处理,能够依据这条规矩去除无效的 shuffle 衔接。
然后依据下面句子进一步对有用的 shuffle 衔接做处理。
针对一条数据进行剖析:
剖析成果: 左表用“ 字符 1”表明, 右表用“ 字符 2”表明,上面的
中的“ key”表明左表与右表的衔接键。而“ value-list”表明以“ key”衔接的左表与右表的
相关数据。
依据上面针对左表与右表不同的处理规矩,获得两个数组的数据如下所示:
然后依据下面句子进行处理。
处理成果如下面所示:
其他的有用 shuffle 衔接处理都是如此。
(3)检查运转成果
这时咱们右击 Eclipse 的“ DFS Locations”中“ /user/hadoop”文件夹进行改写,这时会发现多出一个“ STjoin_out”文件夹,且里边有 3 个文件,然后翻开双其“ part-r-00000”文件,会在 Eclipse 中心把内容显现出来。如图 4.4-4 所示。
知优网 » MapReduce初级事例——单表相关(mapreduce简单例子)