MapReduce 表连接

题目描述:

根据给定的关系

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则是对后者的处理,最后一步为笛卡尔积

时间: 2024-10-14 08:11:59

MapReduce 表连接的相关文章

MapReduce表连接之半连接SemiJoin

一:背景 SemiJoin,一般称为半连接,其原理是在Map端过滤掉一些不需要join的数据,从而大大减少了reduce和Shuffle的时间,因为我们知道,如果仅仅使用Reduce端连接,那么如果一份数据,存在大量的无效数据,而这些数据在join中并不需要,但是因为没有做过预处理,所以这些数据直到真正执行reduce函数时,才被定义为无效数据,但是这个时候已经执行过了Shuffle.merge还有sort操作,所以这部分无效的数据就浪费了大量的网络IO和磁盘IO,所以在整体来讲,这是一种降低性

MapReduce表连接操作之Reduce端join

一:背景 Reduce端连接比Map端连接更为普遍,因为输入的数据不需要特定的结构,但是效率比较低,因为所有数据都必须经过Shuffle过程. 二:技术实现 基本思路 (1):Map端读取所有的文件,并在输出的内容里加上标示,代表数据是从哪个文件里来的. (2):在reduce处理函数中,按照标识对数据进行处理. (3):然后根据Key去join来求出结果直接输出. 数据准备 准备好下面两张表: (1):tb_a(以下简称表A) [java] view plain copy id  name 1

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

继上篇了解了使用MapReduce计算平均数以及去重后,我们再来一探MapReduce在排序以及单表关联上的处理方法.在MapReduce系列的第一篇就有说过,MapReduce不仅是一种分布式的计算方法,更是一种解决问题的新思维.新思路.将原先看似可以一条龙似的处理一刀切成两端,一端是Map.一端是Reduce,Map负责分,Reduce负责合. 1.MapReduce排序 问题模型: 给出多个数据文件输入如: sortfile1.txt 11 13 15 17 19 21 23 25 27

MapReduce 多表连接

题目描述: 现在有两个文件,1为存放公司名字和城市ID,2为存放城市ID和城市名 表一: factoryname,addressed Beijing Red Star,1 Shenzhen Thunder,3 Guangzhou Honda,2 Beijing Rising,1 Guangzhou Development Bank,2 Tencent,3 Back of Beijing,1 表2: 1,Beijing 2,Guangzhou 3,Shenzhen 4,Xian 现在要求输出公司名

Hadoop 多表连接

环境:CentOS6.6  Hadoop1.2.1 样例数据: [[email protected] ~]$ hadoop fs -cat ./in/7/dept.txt 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON [[email protected] ~]$ hadoop fs -cat ./in/7/emp.txt 7369 SMITH CLERK 7902 17-12月-80

Hadoop 学习之单表连接

我在学习hadoop, 在看 陆嘉恒编著的hadoop实战,其中有单表连接的程序,我现在整理一下思路.这个问题是课本上的例子. 给出 child-parent 表, 要求输出 grandchild-grandparent 表 样例输入: child parent Tom Lucy Tom Jack Jone Lucy Jone Jack Lucy Mary Lucy Ben Jack Alice Jack Jesee Terry Alice Terry Jesee Philip Terry Ph

SQL Server三种表连接原理

http://msdn.microsoft.com/zh-cn/library/dn144699.aspx 简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge Join,Hash Join这三种物理连接中的一种.理解这三种物理连接是理解在表连接时解决性能问题的基础,下面我来对这三种连接的原理,适用场景进行描述. 嵌套循环连接(Nested Loop J

每天一点数据库之-----Day 9 表连接

每天一点数据库之-----Day 9 表连接 ----转载请注明出处:coder-pig 本节引言: 前面我们学习的都是针对一个表来进行操作的,上一节虽然学了UNION这个可以操作多个表 的关键字,但是又有两个限制(查询字段数目与数据类型要相同),本节就来学习通过表连接 来操作多个表!而表连接又有四种: 内连接,外连接,交叉连接与自连接,那么接下来开始本节学习! 数据准备: 在开始学习前,我们先准备一些数据,建三个表:T_Stu,T_Class,T_Dorm 建T_Stu表: CREATE TA

表连接查询与where后使用子查询的性能分析。

子查询就是在一条查询语句中还有其它的查询语句,主查询得到的结果依赖于子查询的结果. 子查询的子语句可以在一条sql语句的FROM,JOIN,和WHERE后面,本文主要针对在WHERE后面使用子查询与表连接查询的性能做出一点分析. 对于表连接查询和子查询性能的讨论众说纷纭,普遍认为的是表连接查询的性能要高于子查询.本文将从实验的角度,对这两种查询的性能做出验证,并就实验结果分析两种查询手段的执行流程对性能的影响. 首先准备两张表 1,访问日志表mm_log有150829条记录(相关sql文件已放在