题目描述:

根据给定的关系
child parent
Tom Lucy
Tom Jack
Jone Lucy
Jone Jack
Lucy Mary
Lucy Ben
Jack Alice
Jack Jesse
Terry Alice
Terry Jesse
Philip Terry
Philip Alma
Mark Terry
Mark Alma
打印出grandchild和grandparents。例如Lucy是Tom 的母亲,而Mary是lucy的目前,那么mary就是tom的外婆
 
思路:
可知Tom和Mary的关系的建立在于Lucy,也就是说我们只要建立两个表,都存放child和parents如果一个表1中的child和另一个表2中的parents对应,那就说明那个表1中的parents是表2中的child的grandparents了,同理可得grandchild。
那么对于对应关系而言,我们可以利用reduce中会自动将相同的key放在一起这个特性。通过map我们希望得到(childname,1+childname+parentname),(parentname,2+childname+parentname),这样通过reduce,会将childname和parentname相同的归到一类,1和2表示该value的key是child还是parents,通过这个可以获得1的parents是2的child的grandparents
具体代码:
public class MyMapper extends Mapper<LongWritable, Text, Text, Text> {
 
                 public void map(LongWritable ikey, Text ivalue, Context context)
                                                 throws IOException, InterruptedException {
                                String line=ivalue.toString();
                                StringTokenizer st= new StringTokenizer(line);
                                String childname=st.nextToken().toString();
                                String parentname=st.nextToken().toString();
                                 if(childname.compareTo("child" )!=0){
                                                context.write( new Text(parentname),new Text("1"+"+" +childname+"+"+parentname));
                                                context.write( new Text(childname),new Text("2"+"+" +childname+"+"+parentname));
                                }
                }
 
}
 
 
map主要用于格式化输出
 
 
public class MyReducer extends Reducer<Text, Text, Text, Text> {
static int  time=0;
public void reduce(Text _key, Iterable<Text> values, Context context)
throws IOException, InterruptedException {
// process values
if (time==0){
context.write(new Text("grandchild"),new Text("grandparent"));
time++;
}
ArrayList<String> child=new ArrayList<String>();
ArrayList<String> parent=new ArrayList<String>();
for (Text val : values) {
String relation=val.toString();
StringTokenizer st=new StringTokenizer(relation,"+");
int flag=Integer.parseInt(st.nextToken());
String childname=st.nextToken().toString();
String parentname=st.nextToken().toString();
if(flag==1){
child.add(childname);
}else if(flag==2){
parent.add(parentname);
}
}
if(child.size()!=0&&parent.size()!=0){
for(int i=0;i<child.size();i++){
for(int j=0;j<parent.size();j++){
context.write(new Text(child.get(i)),new Text(parent.get(j)));
}
}
}
}
 
}
 
而reduce则是对后者的处理,最后一步为笛卡尔积
 
 
 
 
 
 
 

MapReduce 表连接的更多相关文章

  1. Hadoop阅读笔记(三)——深入MapReduce排序和单表连接

    继上篇了解了使用MapReduce计算平均数以及去重后,我们再来一探MapReduce在排序以及单表关联上的处理方法.在MapReduce系列的第一篇就有说过,MapReduce不仅是一种分布式的计算 ...

  2. MapReduce 多表连接

    题目描述: 现在有两个文件,1为存放公司名字和城市ID,2为存放城市ID和城市名 表一: factoryname,addressed Beijing Red Star,1 Shenzhen Thund ...

  3. Hadoop-Map/Reduce之单表连接的实现

    MapReduce程序就是根据其特性对数据进行一个简单的逻辑处理,其中最为重要的一个特性就是根据key值将value值进行合并,其次就是在shuffle阶段有排序. 遇到一个MR程序就是要巧妙利用合并 ...

  4. SQL多表连接查询(详细实例)

    转载博客:joeleo博客(http://www.xker.com/page/e2012/0708/117368.html) 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:stud ...

  5. 关于Oracle表连接

    表连接注意left join on与where的区别: select * from dept; select * from emp; select * from emp a right outer j ...

  6. SQL多表连接查询

    SQL多表连接查询 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student  截图如下: 表2:course  截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际 ...

  7. oracle(sql)基础篇系列(二)——多表连接查询、子查询、视图

        多表连接查询 内连接(inner join) 目的:将多张表中能通过链接谓词或者链接运算符连接起来的数据查询出来. 等值连接(join...on(...=...)) --选出雇员的名字和雇员所 ...

  8. Access数据库多表连接查询

    第一次在Access中写多表查询,就按照MS数据库中的写法,结果报语法错,原来Access的多表连接查询是不一样的 表A.B.C,A关联B,B关联C,均用ID键关联 一般写法:select * fro ...

  9. PostgreSQL-join多表连接查询和子查询

    一.多表连接查询 1.连接方式概览 [inner] join 内连接:表A和表B以元组为单位做一个笛卡尔积,记为表C,然后在C中挑选出满足符合on 语句后边的限制条件的内容. left [outer] ...

随机推荐

  1. NSObject Class 浅析

    Objective-C中有两个NSObject,一个是NSObject类,另一个是NSObject协议.而其中NSObject类采用了NSObject协议.在本文中,我们主要整理一下NSObject类 ...

  2. Android Studio中配置及使用OpenCV示例

    Android Studio配置及使用OpenCV 前言:最近在做项目移植,项目较大,在Eclipse中配置的Jni及OpenCV环境没任何问题,但是迁移到Studio中就问题一大堆,网上也找了一些资 ...

  3. ACM暑期训练总结

    ACM暑期集训总结报告 不知不觉,ACM暑期集训已经过去了一个月了(其实我还差几天才够一个月,因为最后几天要回家办助学贷款,所以没坚持到最后,当了个逃兵.....[汗])也到了结束的时候.在这一个月中 ...

  4. Python -- OOP高级 -- 元类

    type()函数既可以返回一个对象的类型,又可以创建出新的类型 def fn(self, name="world"): print("Hello, %s!" % ...

  5. Python -- OOP高级 -- 枚举类

    Enum可以把一组相关常量定义在一个class中,且class不可变,而且成员可以直接比较. from enum import Enum Month = Enum('Month', ('Jan', ' ...

  6. 2016中国大学生程序设计竞赛 - 网络选拔赛 1004 Danganronpa

    Problem Description Chisa Yukizome works as a teacher in the school. She prepares many gifts, which ...

  7. OpenCart之联系我们contact us页面提交时邮件错误

    许多OpenCart系统的用户都发现联系我们contact us页面提交时发生错误.本页发生错误是正常的,原因如下: 1. 你设定了SMTP,因此SMTP默认是从你设置的SMTP的email账户中发出 ...

  8. hdu_5418_Victor and World(状压DP+Floyd)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5418 题意:给你n个点,和一些边,找一条路径经过全部的点,并回到起点,问最小的花费是多少, 题解:m& ...

  9. uploadify在IE6下的问题

    上传插件uploadify,在IE8下运行的没有问题.转到IE6下时,就不能上传了. 把浏览器的“检查所存网页的较新版本” 设置为“每次访问网页时 ”就没有问题,如果设置为“自动 ”,IE6下就不能上 ...

  10. Entity Framework 学习初级篇6--EntityClient

    System.Data.EntityClient 命名空间是 实体框架的 .NET Framework 数据提供程序.EntityClient 提供程序使用存储特定的 ADO.NET 数据提供程序类和 ...