一、总体解析:
1.需求
实例中给出child-parent(孩子——父母)表,要求输出grandchild-grandparent(孙子——爷奶)表。
数据如下:
A1,A2
B1,A2
B2,A31
A2,A31
A2,A32
A31,A41
2.实现思路
核心实现思路:
(1)在Map阶段,分别将父子关系与相反的子父关系在各个value前补上前缀"-“与”+"标识此key-value中的value是正序还是逆序产生的,之后进入context。这样做的目的是让之后的Reduce阶段有同样的key值,并根据标识符判断祖孙关系。
即得到数据:
A1,A2 —> (A1 A2)(A2,A1)
A2,A31 ---->(A2,A31)(A31,A2)
(2)MapReduce会自动将同一个key的不同的value值,组合在一起,推到Reduce阶段。在value数组中,根据前缀,我们可以得知,哪个是祖辈,哪个是孙辈。
即得到的数据:
(A2,A1)(A2,A31) ---->(A2:A1,A31)
将相同的key值连接起来,这样得到的两个value就是祖孙关系。
二、祖孙关系
1.实现代码如下
import java.io.IOException;
import java.util.ArrayList;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
public class SingleTableJoin {
public static class