治疗技术焦虑的方法就是学习!

[转]hadoop编程实例–单表关联

Java 李新广 642℃ 0评论

        前面的几篇文章中的实例都是在数据上进行一些简单的处理,为进一步的操作打基础。”单表关联“这个实例要求给出的数据寻找关心的数据,它是对原始数据所包含信息的挖掘。下面进入这个实例。

1.1 实例描述

    实例中给出child-parent(孩子——父母)表,要求输出grandchild-grandparent(孙子——爷奶)表。
    样例输入如下所示。
   file: 


   家族
树状关系谱:


样例输出如下所示。
  file:

1.2 设计思路

        分析这个实例,显然需要进行单表连接,连接的是
左表
parent列和
右表
child列,且
左表
右表
同一个表

  连接结果除去连接的两列就是所需要的结果——”grandchild–grandparent”表。要用MapReduce解决这个实例,首先应该考虑如何实现自连接其次就是连接列设置最后结果整理
      考虑到MapReduce的shuffle过程会将相同的key会连接在一起,所以可以将map结果的key设置成待连接,然后列中相同的值就自然会连接在一起了。再与最开始的分析联系起来:
  要连接的是左表的parent列和右表的child列,且左表和右表是同一个表,所以在map阶段读入数据分割childparent之后,会将parent设置成keychild设置成value进行输出,并作为左表;再将同一对childparent中的child设置成keyparent设置成value进行输出,作为右表。为了区分输出中的左右表,需要在输出的value加上左右表信息,比如在value的String最开始处加上字符1表示左表,加上字符2表示右表。这样在map的结果中就形成了左表和右表,然后在shuffle过程中完成连接。reduce接收到连接的结果,其中每个key的value-list就包含了”grandchild–grandparent”关系。取出每个key的value-list进行解析,将左表中的child放入一个数组右表中的parent放入一个数组,然后对两个数组求笛卡尔积就是最后的结果了。

1.3 程序代码

    程序代码如下所示。


运行详解

(1)Map处理:
    map函数输出结果如下所示。


(2)Shuffle处理
    在shuffle过程中完成连接。

(3)Reduce处理
    首先由语句”0 != grandchildnum && 0 != grandparentnum“得知,只要在”value-list”中没有左表或者右表,则不会做处理,可以根据这条规则去除无效shuffle连接


然后根据下面语句进一步对有效的shuffle连接做处理。


针对一条数据进行分析:


分析结果
左表用”
字符1“表示,
右表用”
字符2“表示,上面的中的”
key“表示
左表与右表
连接键。而”
value-list“表示
以”key”连接
左表与右表
相关数据

    根据上面针对左表与右表不同的处理规则,取得两个数组的数据如下所示:
 

grandchild Tom、Jone(grandchild[grandchildnum] = childname;)
grandparent Alice、Jesse(grandparent[grandparentnum] = parentname;)

   
然后根据下面语句进行处理。


处理结果如下面所示:
 

Tom        Jesse Tom        Alice Jone        Jesse Jone        Alice 

    其他的有效shuffle连接处理都是如此

转载请注明:大道至简 » [转]hadoop编程实例–单表关联

喜欢 (1)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址