本文通过一个简单的样例child-parent 表来介绍单表关联,在介绍这部分内容的时候主要包括两部分:1、描述清楚每一部分设计的思路;2、基于Mapreduce 进行了实现。
1. 样例child-parent表的内容和期望的输出
我们得到一个child-parent 表,然后希望能够通过挖掘到两列之间的关系,得到一个新的表 grandchild-grandparent 。
为了方便说明问题,首先给出一个简单的家庭人物关系图。
我们已知的表是表示孩子 和父母之间的对应关系,然后求出孩子和爷爷奶奶(姥姥姥爷)的对应关系。因此我们的输入如下图所示。
输入:
这里输入包括两列,第一列为child列,第二列为parent列。
然后我们通过连接的方式找到孩子父母的父母。所以它的输出结果如下:
2. 设计思路
现在对这个实例进行分析,已知给出child-parent 表,要想得到grandchild-grandparent表,那么就需要进行单表连接。即对左表的child列 和 右表的parent 列进行连接,且左表 和 右表 是同一个表。
2.1 Map过程的设计
- 对读入的一行文本进行解析,得到两部分内容: child 和parent 。
- 因为要实现单表关联,实际上就是两张表的连接,那我们希望Map过程的输出是两张表的内容,因此Map的输出应该是两类:
- 第一类输出的< key,value>中child作为key,parent 作为value
- 第二类输出的< key,value>要把parent 作为key ,child 作为value。
- 这样在map过程处理完所有行之后,它的输出既输出了左表child-parent,又输出了右表parent-child。
- 另外 ,还要对这两类进行区别,比如第一类的输出的value里加入”@”,第二类输出的value里加入’&’。
经过Map过程之后,会得到如下结果:
Map结果输出之后,MapReduce框架自动实现Shuffle 过程,结果如下:
从Shuffle结果可以看出,输出的key为家庭各个成员,输出的value 为每个成员的父母或者子女,并且可以通过字符@或者&进行区分。
那么我们可以得出,若一个成员的value列表中仅含有父母或者仅含有子女,则