Hadoop HelloWorld Examples - 单表连接

标签: hadoop helloworld examples | 发表时间:2013-08-25 11:00 | 作者:qiul12345
出处:http://blog.csdn.net

  应该是那本"Hadoop 实战"的第4个demo了,单表连接。给出一对对的children和parents的名字,然后输出所有的grandchildren和grandparents对。

  输入数据(第一列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)

Tom    Jesse
Tom    Alice
Jone    Jesse
Jone    Alice
Jone    Ben
Jone    Mary
Tom    Ben
Tom    Mary
Philip    Alice
Philip    Jesse
Mark    Alice
Mark    Jesse

  不知到是"Hadoop 实战" 还是那个虾皮工作室写的解法,把这个问题说成是单表联接。个人觉得其实没有这么深奥,说白了非常的简单,map输入:如上所说,key是child's name, value是parent's name; map的输出:key是名字,value是“标识+名字”,其中标识'0'后面接他的child's name,'1'接他的parent's name。比如第一个记录Tom Lucy,那么key是"Tom", value是" 1Lucy",还有key是lucy,value是" 0Tom" 。 reducer的输入:对于每一个人名(key),它的一系列values是他的children或者parents name(通过标识来识别是children还是parents),这样子得到key的children集合和parents集合(说白了就是知道了key的所有children和parents的名字)。然后求这两个集合的乘积(或者称为笛卡尔积)即可。。

  具体代码如下:

import java.util.*;
import java.io.*;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.TextInputFormat;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.mapreduce.lib.input.KeyValueTextInputFormat;


public class oneTableConnect {
	
	public static class tableMapper extends Mapper<Text, Text, Text, Text>
	{
		@Override
		public void map(Text key, Text value, Context context) throws IOException, InterruptedException
		{
			context.write(key, new Text( "1" + value.toString()));
			context.write(value, new Text("0" + key.toString()));
		}
	}
	
	
	public static class tableReducer extends Reducer<Text, Text, Text, Text>
	{
		@Override
		public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException
		{
			String[] gChildren = new String[10];
			String[] gParents = new String[10];
			int cNum = 0;
			int pNum = 0;
			for(Text val : values)
			{
				if(val.toString().charAt(0)  == '0')// the key's child.
				{
					gChildren[cNum++] = val.toString().substring(1);
				}
				else//the key's parent.
				{
					gParents[pNum++] = val.toString().substring(1);
				}
			}
			
			for(int i=0; i<cNum; i++)
				for(int j=0;j<pNum;j++)
				{
					context.write(new Text(gChildren[i]), new Text(gParents[j]));
				}
		}	
	}
	
	public static void main(String[] args) throws Exception
	{
		Configuration conf = new Configuration();
		conf.set("mapreduce.input.keyvaluelinerecordreader.key.value.separator", " ");
		
		Job job = new Job(conf, "tableConnect");
		job.setJarByClass(oneTableConnect.class);
		
		job.setMapperClass(tableMapper.class);
		job.setReducerClass(tableReducer.class);
		
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(Text.class);
		
		job.setInputFormatClass(KeyValueTextInputFormat.class);
		job.setOutputFormatClass(TextOutputFormat.class);
		
		FileInputFormat.addInputPath(job, new Path(args[0]));
		FileOutputFormat.setOutputPath(job, new Path(args[1]));
		
		System.exit( job.waitForCompletion(true) ? 0 : 1);
	}
}


 



作者:qiul12345 发表于2013-8-25 11:00:25 原文链接
阅读:111 评论:0 查看评论

相关 [hadoop helloworld examples] 推荐:

Hadoop HelloWorld Examples - 单表连接

- - CSDN博客云计算推荐文章
  应该是那本"Hadoop 实战"的第4个demo了,单表连接. 给出一对对的children和parents的名字,然后输出所有的grandchildren和grandparents对.   输入数据(第一列child,第二列 parent).   输出数据(第一列grandchild,第二列grandparents).

Hadoop HelloWord Examples- 求平均数

- - CSDN博客云计算推荐文章
  另外一个hadoop的入门demo,求平均数. 是对WordCount这个demo的一个小小的修改. 输入一堆成绩单(人名,成绩),然后求每个人成绩平均数,比如:.   求a,b,c这三个人的平均分. 解决思路很简单,在map阶段key是名字,value是成绩,直接output. reduce阶段得到了map输出的key名字,values是该名字对应的一系列的成绩,那么对其求平均数即可.

springbatch简介与helloworld

- - CSDN博客推荐文章
一、SpringBatch简介. Spring Batch是一个轻量级的批处理框架, 可以用于企业级海量数据处理, 它提供以下技术解决方案:. 二、SpringBatch结构. Spring Batch由应用层、核心层、基础架构层等组成:. 应用层: 包含所有的批处理作业,  使用spring框架管理程序员自定义的代码.

百度地图API--HelloWorld

- - CSDN博客推荐文章
百度地图API--Hello World.           这里引用一个经典的单词"Hello World",这个词是程序界所有人都很熟悉的,我在开始学习Java的时候就是从这开始的,什么编写一个Hello World程序,甚至有的面试题中有“写一个输出Hello World的程序”来测试面试者的面向对象的思维.

【PHP框架CodeIgniter学习】Helloworld

- - CSDN博客推荐文章
在想做API的时候 ,在搜索发现大家都钟爱推荐 CodeIgniter 这个轻量级开发框架,于是乎就搜索了一番. 原来CodeIgniter 简称CI,开源框架,好像很多的CMS系统都是基于它进行二次开发的. 自己之前使用过的PHP框架有 ThinkPHP,PHPWind等,感觉有点复杂(可能是自己不大熟悉PHP的原因).

CXF 入门:HelloWorld接口发布

- - ITeye博客
第一步:在myeclipse中新建一个web项目名为myWs,. 并导入依赖的jar包(cxf,spring,apache-commons相关). cxf结合spring时所需jar包,此例子也需要这些,用到了spring上下文加载. 第二步:在WEB-INF中创建基本的cxf-beans.xml内容如下(作用:主要做webservice接口属性配置,通过web.xml配置加载,文件名和位置可以顺便,web.xml配置会用到).

通过helloworld来认识下backbone - Ruthless

- - 博客园_Ruthless
Backbone主要涉及3部分:model,collection和view. 而这个框架的优势在于:数据与视图分离,通过操作model来自动更新view. 根据我的个人经验,直接写个简单的例子是最最直观的,那么从hello world开始吧. 程序目标:创建人员,将人员添加入队伍,删除人员,清空队列.

【转贴备忘】[教程]iPhone 實機開發 Part 1 - HelloWorld

- zii - 博客园-oiramario
最近小弟開始在研究 iPhone 的開發,無奈找到的資料都是舊的,也不知道怎麼放到 iPhone 上,應該很多人都跟我有同樣的困擾吧!經過幾天的研究總算寫出第一個 HelloWorld,而且可以不用付99元美金就可以放到實機上執行. 今天先和大家分享怎麼放到手機上,以及基本的 Xcode 使用:. iPhone 港版16G+FW2.2+越獄.

酷酷的前端MVC框架AngularJS(二)HelloWorld

- - ITeye博客
angularJS在github上面进行一个代码的托管. 地址:https://github.com/angular/angularjs.org  . 注意:需要兼容IE8的同学请下载1.3之前的版本,在1.3之后已经放弃了IE8,估计是为了以后大版本升级做铺垫吧. 各个版本的下地址在这里https://github.com/angular/angular.js/releases.

VisualVM分析与HelloWorld、springBoot项目 - metabolism - 博客园

- -
VisualVM分析与HelloWorld、springBoot项目. 自从1995年第一个JDK版本JDKBeta发布,至今已经快25年,这些年来Java的框架日新月异,从最开始的Servlet阶段,到SSH,SSI,SSM,springboot等,还有一些其他方向的框架微服务SpringCloud、响应式编程Spring Reactor.