hadoop程序MapReduce之SingletonTableJoin
需求:单表关联问题。从文件中孩子和父母的关系挖掘出孙子和爷奶关系
样板:child-parent.txt
xiaoming daxiong
daxiong alice
daxiong jack
输出:xiaoming alice
xiaoming jack
分析设计:
mapper部分设计:
1、<k1,k1>k1代表:一行数据的编号位置,v1代表:一行数据。
2、左表:<k2,v2>k2代表:parent名字,v2代表:(1,child名字),此处1:代表左表标志。
3、右表:<k3,v3>k3代表:child名字,v3代表:(2,parent名字),此处2:代表右表标志。
reduce部分设计:
4、<k4,v4>k4代表:相同的key,v4代表:list<String>
5、求笛卡尔积<k5,v5>:k5代表:grandChild名字,v5代表:grandParent名字。
程序部分:
SingletonTableJoinMapper类
package com.cn.singletonTableJoin; import java.io.IOException;
import java.util.StringTokenizer; import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper; public class SingletonTableJoinMapper extends Mapper<Object, Text, Text, Text> {
@Override
protected void map(Object key, Text value, Mapper<Object, Text, Text, Text>.Context context)
throws IOException, InterruptedException {
String childName = new String();
String parentName = new String();
String relationType = new String();
String[] values=new String[2];
int i = 0;
StringTokenizer itr = new StringTokenizer(value.toString());
while(itr.hasMoreElements()){
values[i] = itr.nextToken();
i++;
}
if(values[0].compareTo("child") != 0){
childName = values[0];
parentName = values[1];
relationType = "1";
context.write(new Text(parentName), new Text(relationType+" "+childName));
relationType = "2";
context.write(new Text(childName), new Text(relationType+" "+parentName));
}
}
}
SingletonTableJoinReduce类:
package com.cn.singletonTableJoin; import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer; public class SingletonTableJoinReduce extends Reducer<Text, Text, Text, Text> {
@Override
protected void reduce(Text key, Iterable<Text> values, Reducer<Text, Text, Text, Text>.Context context)
throws IOException, InterruptedException {
List<String> grandChild = new ArrayList<String>();
List<String> grandParent = new ArrayList<String>();
Iterator<Text> itr = values.iterator();
while(itr.hasNext()){
String[] record = itr.next().toString().split(" ");
if(0 == record[0].length()){
continue;
}
if("1".equals(record[0])){
grandChild.add(record[1]);
}else if("2".equals(record[0])){
grandParent.add(record[1]);
}
}
if(0 != grandChild.size() && 0 != grandParent.size()){
for(String grandchild : grandChild){
for(String grandparent : grandParent){
context.write(new Text(grandchild), new Text(grandparent));
}
}
}
}
}
SingletonTableJoin类
package com.cn.singletonTableJoin; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
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.util.GenericOptionsParser; /**
* 单表关联
* @author root
*
*/
public class SingletonTableJoin {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length != 2) {
System.err.println("Usage: SingletonTableJoin ");
System.exit(2);
}
//创建一个job
Job job = new Job(conf, "SingletonTableJoin");
job.setJarByClass(SingletonTableJoin.class); //设置文件的输入输出路径
FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); //设置mapper和reduce处理类
job.setMapperClass(SingletonTableJoinMapper.class);
job.setReducerClass(SingletonTableJoinReduce.class); //设置输出key-value数据类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class); //提交作业并等待它完成
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
把总结当成一种习惯。
hadoop程序MapReduce之SingletonTableJoin的更多相关文章
- hadoop程序MapReduce之average
需求:求多门课程的平均值. 样板:math.txt zhangsan 90 lisi 88 wanghua 80 china.txt zhangsan 80lisi 90wanghua 88 输出:z ...
- hadoop程序MapReduce之DataSort
需求:对文件中的数据进行排序. 样本:sort.log 10 13 10 20 输出:1 10 2 10 3 13 4 20 分析部分: mapper分析: 1.<k1,v1>k1代表:行 ...
- hadoop程序MapReduce之DataDeduplication
需求:去掉文件中重复的数据. 样板:data.log 2016-3-1 a 2016-3-2 b 2016-3-2 c 2016-3-2 b 输出结果: 2016-3-1 a 2016 ...
- hadoop程序MapReduce之MaxTemperature
需求:求每年当中最高的温度 样本:temp.log 2016080623 2016072330 2015030420 输出结果:2016 30 2015 20 MapReduce分析设计: Mappe ...
- hadoop程序MapReduce之WordCount
需求:统计一个文件中所有单词出现的个数. 样板:word.log文件中有hadoop hive hbase hadoop hive 输出:hadoop 2 hive 2 hbase 1 MapRedu ...
- 用PHP编写Hadoop的MapReduce程序
用PHP编写Hadoop的MapReduce程序 Hadoop流 虽然Hadoop是用Java写的,但是Hadoop提供了Hadoop流,Hadoop流提供一个API, 允许用户使用任何语言编 ...
- Hadoop之MapReduce程序应用三
摘要:MapReduce程序进行数据去重. 关键词:MapReduce 数据去重 数据源:人工构造日志数据集log-file1.txt和log-file2.txt. log-file1.txt内容 ...
- 如何在Windows下面运行hadoop的MapReduce程序
在Windows下面运行hadoop的MapReduce程序的方法: 1.下载hadoop的安装包,这里使用的是"hadoop-2.6.4.tar.gz": 2.将安装包直接解压到 ...
- Hadoop之Mapreduce 程序
package com.gylhaut.hadoop.senior.mapreduce; import java.io.IOException; import java.util.StringToke ...
随机推荐
- maven打包可以行文件,包含依赖包等
<build> <!-- 设定打包的名称 --> <finalName>ismp2xy</finalName> <plugins> < ...
- maven引入ojdbc
http://blog.csdn.net/linminqin/article/details/17922413 ******************************************** ...
- C# 延时函数 非Sleep
1.示例: using System.Runtime.InteropServices; [DllImport("kernel32.dll")] static extern uint ...
- 问题-DelphiXE10.2怎么安装文本转语音(TTS)语音转文本(SR)控件(XE10.2+WIN764)
相关资料: http://edn.embarcadero.com/article/29583 http://blog.sina.com.cn/s/blog_53866d7501017r1o.html ...
- EMC现场测试-EFT、ESD、Surge和场辐射
EMC测试主要进行了4项: 1. ESD 采用静电枪测试,接触电压±6KV,检测了整个箱体和内部可见金属部分: 空气放电正负8KV,检测了箱体及内部金属部分(如板卡壳体),特别检测了220V电源插头及 ...
- oozie中调度mapreduce
mapreduce可以直接对hdfs进行清洗和计算,这里介绍oozie中如何调度使用. 操作步骤如下: 1. 写一个mapper和reduce类,并且打包成jar包 2. 在workflow中引用ma ...
- datagrid中reoload提交时如何批量提交表单中的查询条件
看标题描述有点复杂,看下图: 直接将手工添加的一个个字段直接用一句代码完成. $('#dg_sub').datagrid("reload",$('#searchForm').ser ...
- CentOS5.4安装redmine详细步骤
>>>>概述<<<< 这里不解释什么是redmine及用来做什么,如果不知道用来做什么,估计也不会把它安装到CentOS5.4上.哈哈…… 以下为详细的 ...
- kill 的常用信号
kill命令用于终止指定的进程(terminate a process),是Unix/Linux下进程管理的常用命令.通常,我们在需要终止某个或某些进程时,先使用ps/pidof/pstree/top ...
- 普通windows版本安装winServer的特色功能 以dedup功能为展示点
安装 Windows 功能角色 1.选择安装源 在 Windows 8.1 系统上不存在重复数据删除功能,需要从对应的服务器版本,即 Windows Server 2012 R2 上提取相关文件. 2 ...