一、任务描述
我们有两个表,雇员表和部门表。
雇员表:
Name | Empld | DeptName |
---|---|---|
Harry | 3415 | 财务 |
Sally | 2241 | 销售 |
George | 3401 | 财务 |
Harriet | 2202 | 销售 |
部门表:
DeptName | Manager |
---|---|
财务 | Gem |
销售 | Hans |
生产 | Charles |
它们由公共字段DeptName,所以有自然连接条件。
具体做法是,以DeptName相等与否为依据,将雇员表的每一行依次和部门表匹配,每次匹配成功即输出一行结果。最终输出自然连接结果如下表
Name | Empld | DeptName | Manager |
---|---|---|---|
Harry | 3415 | 财务 | Gem |
Sally | 2241 | 销售 | Hans |
George | 3401 | 财务 | George |
Harriet | 2202 | 销售 | Hans |
二、MapReduce实现
1. Split&RR
这里假设每个表为一个Split(可以拆更多)。然后做RR将关系表转为键值对:表名为key,其他字段组成的元组为value(注意多字段写入元组,所以还是value而非value list)。
雇员Split&RR结果
<"雇员表", (("Harry", 3415, "财务"),
("Sally", 2241, "销售"),
("George", 3401, "财务"),
("Harriet", 2202, "销售"))>
部门Split&RR结果
<"部门表", (("财务", Gem),
("销售", Hans),
("生产", Charles))>
2. Map
将Split&RR结果输入Map函数。因为有两个Split所以有两个Map任务。Map的输出格式为键值对,逻辑为:公共字段DeptName为key,value为表名和其他部分组成的元组。
雇员Map结果
<"财务", ("雇员表", (Harry, 3415))>
<"销售", ("雇员表", (Sally, 2241))>
<"财务", ("雇员表", (George, 3401))>
<"销售", ("雇员表", (Harriet, 2202))>
部门Map结果
<"财务", ("部门表", (Gem))>
<"销售", ("部门表", (Hans))>
<"生产", ("部门表", (Charles))>
3. Shuffle
将各Map中,有相同key的归并到一起,输出<key, value-list>格式。
雇员Shuffle结果
<"财务", <("雇员表", (Harry, 3415)), ("雇员表", (George, 3401))>>
<"销售", <("雇员表", (Sally, 2241)), ("雇员表", (Harriet, 2202))>>
部门Shuffle结果
<"财务", <("部门表", (Gem))>>
<"销售", <("部门表", (Hans))>>
<"生产", <("部门表", (Charles))>>
4. Reduce
Reduce的逻辑是:输入中,key相同,但value list中表名项不同value的做连接(注意Reduce是不直接记录输入从哪个Map来的,而且原始表可以拆分到更多Map中);输出的key是新行号(比如这里假设要求以Empld升序排列),value就是把其他部分的元组和输入键合起来(注意表名只是用于判定,输出结果不需要)
<1, (Harriet, 2202, Hans, "销售")>
<2, (Sally, 2241, Hans, "销售")>
<3, (George, 3401, Gem, "财务")>
<4, (Harry, 3415, Gem, "财务")>
三、其他常见应用场景
关系代数运算(选择、投影、布尔、连接等)、矩阵运算、分组聚合运算等等。
四、执行方式
在Hadoop执行MapReduce任务的方式有很多。可以直接使用shell命令,也可以生成jar包,或者编写Python脚本;另外,Pig和Hive提供类SQL语句,框架可将其自动转换为MapReduce任务。用户可以酌情选择。
Reference:
https://www.icourse163.org/learn/XMU-1002335004#/learn/content?type=detail&id=1214310155&sm=1