MapReduce,DataJoin,链接多数据源
主要介绍用DataJoin类来链接多数据源,先看一下例子,假设二个数据源customs和orders
customer ID Name PhomeNumber
1 赵一 025-5455-566
2 钱二 025-4587-565
3 孙三 021-5845-5875
客户的订单号:
Customer ID order ID Price Data
2 1 93 2008-01-08
3 2 43 2012-01-21
1 3 43 2012-05-12
2 4 32 2012-5-14
问题:现在要生成订单
customer ID name PhomeNumber Price Data
2 钱二 025-4587-565 93 2008-01-08
上面是一个例子,下面介绍一下hadoop中DataJoin类具体的做法。
首先,需要为不同数据源下的每个数据定义一个数据标签,这一点不难理解,就是标记数据的出处。
其次,需要为每个待链接的数据记录确定一个链接主键,这一点不难理解。DataJoin类库分别在map阶段和Reduce阶段提供一个处理框架,尽可能帮助程序员完成一些处理的工作,仅仅留下一些必须工作,由程序完成。
Map阶段
DataJoin类库里有一个抽象基类DataJoinMapperBase,该基类实现了map方法,该方法为对每个数据源下的文本的记录生成一 个带表见的数据记录对象。但是程序必须指定它是来自于哪个数据源,即Tag,还要指定它的主键是什么即GroupKey。如果指定了Tag和 GroupKey,那么map将会生成一下的记录,customer表为例
customers 1 赵一 025-5455-566; customers 2 钱二 025-4587-565;
Map过程中Tag和GroupKey都是程序员给定,所以要肯定要就有接口供程序员去实现,DataJoinMapperBase实现下面3个接口。
abstract Text gernerateInputTag(String inuptFile), 看方法名就知道是设置Tag。
abstract Text generateGroupKey(TaggedMapOutput lineRecord), 该方法是设置GroupKey,其中,lineRecord是数据源中的一行数据,该方法可以在这一行数据上设置任意的GroupKey为主键。
abstract TaggedMapOutput generateMapOutput(object value), 该抽象方法用于把数据源中的原始数据记录包装成一个带标签的数据源。TaggedMapOutputs是一行记录的数据类型。代码如下:
import org.apache.hadoop.contrib.utils.join.*;
import org.apache.hadoop.contrib.utils.join.TaggedMapOutput;
import org.apache.hadoop.io.Text; public class MapClass extends DataJoinMapperBase{ @Override
protected Text generateGroupKey(TaggedMapOutput arg0) {
String line = ((Text)arg0.getData()).toString();
String[] tokens = line.split(",");
String groupKey = tokens[0];
return new Text(groupKey);
} @Override
protected Text generateInputTag(String arg0) { String dataSource = arg0.split("-")[0];
return new Text(dataSource);
} @Override
protected TaggedMapOutput generateTaggedMapOutput(Object arg0) {
TaggedWritable tw = new TaggedWritable((Text)arg0);
tw.setTag(this.inputTag);
return tw;
}
}
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.hadoop.contrib.utils.join.TaggedMapOutput;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable; public class TaggedWritable extends TaggedMapOutput{ private Writable data;
public TaggedWritable(Writable data) {
this.tag = new Text("");
this.data = data;
} @Override
public Writable getData() {
return data;
} @Override
public void readFields(DataInput arg0) throws IOException {
this.tag.readFields(arg0);
this.data.readFields(arg0);
} @Override
public void write(DataOutput arg0) throws IOException {
this.tag.write(arg0);
this.data.write(arg0);
}
}
每个记录的数据源标签可以由generateInputTag()产生,通过setTag()方法设置记录的Tag。
note:1.该记录不是关系数据库,是文本文件,2. TaggedMapOutput 在import org.apache.hadoop.contrib.utils.join.*头文件中,有的时候在eclipse下,每个这个头文件,这时 只要找到你的hadoop的目录下contrib/datajoin文件加,把jar文件导入eclipse中即可。
Reduce 阶段
DataJoinReduceBase中已经实现reduce()方法,具有同一GroupKey的数据分到同一Reduce中,通过reduce的方法将对来自不同的数据源和据用相同的GroupKey做一次叉积组合。这个比较难懂,举个例子:
customers 2 钱二 025-4587-565; orders 2 1 93 2008-01-08; orders 2 4 32 2012-5-14 |
按照map()结果的数据,就是下表给出的结果(3个记录),他们都有一个共同的GroupKey,带来自于二个数据源,所以叉积的结果为
customers 2 钱二 025-4587-565 orders 2 1 93 2008-01-08 |
customers 2 钱二 025-4587-565 orders 2 4 32 2012-5-14 |
如果Reduce阶段看懂了,基本上这个就搞定了,Reduce是系统做的,不需要用户重载,接下来的工作就是要实现一个combine()函数,它的作用是将每个叉积合并起来,形成订单的格式。
代码如下:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.contrib.utils.join.DataJoinReducerBase;
import org.apache.hadoop.contrib.utils.join.TaggedMapOutput;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.jobcontrol.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class ReduceClass extends DataJoinReducerBase{ @Override
protected TaggedMapOutput combine(Object[] tags, Object[] values) {
if(tags.length<2)return null;
StringBuffer joinData = new StringBuffer();
int count=0; for(Object value: values){
joinData.append(",");
TaggedWritable tw = (TaggedWritable)value;
String recordLine = ((Text)tw.getData()).toString();
String[] tokens = recordLine.split(",",2);
if(count==0) joinData.append(tokens[0]);
joinData.append(tokens[1]);
} TaggedWritable rtv = new TaggedWritable(new Text(new String(joinData)));
rtv.setTag((Text)tags[0]);
return rtv;
} public static void main(String[] args){ Configuration conf = new Configuration();
JobConf job = new JobConf(conf, ReduceClass.class); Path in = new Path(args[0]);
Path out = new Path(args[1]);
FileInputFormat.setInputPaths(job, in);
FileOutputFormat.setOutputPath(job, out);
job.setJobName("DataJoin");
job.setMapperClass(MapClass.class);
job.setReducerClass(ReduceClass.class); job.setInputFormat(TextInputFormat.class);
job.setOutputFormat(TextOutputFormat.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(TaggedWritable.class);
job.set("mapred.textoutputformat.separator", ",");
JobClient.runJob(job); }
}
作者:BIGBIGBOAT/Liqizhou
MapReduce,DataJoin,链接多数据源的更多相关文章
- SQLServer——SQLServer链接外部数据源
学习链接:https://www.cnblogs.com/licin/p/6244169.html 一.新建ODBC数据源 1.打开控制面板→管理工具→ODBC数据源→系统DSN 2.添加新系统数据源 ...
- C++链接ODBC数据源:VS2013,Access
参考资料:1.http://wenku.baidu.com/view/a92d1a812cc58bd63186bd8d.html 2.http://blog.sina.com.cn/s/blog_68 ...
- eclipse中tomcat配置JNDI链接Oracle数据源例子
最近换到新公司,第一次接触JNDI方式连接数据库. 一开始怎么找也没找到数据库地址在哪里配置的,后面跟代码发现spring中初始化dataSource是通过这个类JndiObjectFactoryBe ...
- 谷歌三大核心技术(二)Google MapReduce中文版
谷歌三大核心技术(二)Google MapReduce中文版 Google MapReduce中文版 译者: alex 摘要 MapReduce是一个编程模型,也是一个处理和生成超大数据 ...
- 【转】谷歌三大核心技术(二)Google MapReduce中文版
Google MapReduce中文版 译者: alex 摘要 MapReduce 是一个编程模型,也是一个处理和生成超大数据集的算法模型的相关实现.用户首先创建一个Map函数处理一个 ...
- Google MapReduce中文版
英文原文链接: Google Map Reduce 译文原文链接: Google MapReduce中文版 Google MapReduce中文版 译者: alex 摘要 MapReduce是一个编程 ...
- Amazon EMR(Elastic MapReduce):亚马逊Hadoop托管服务运行架构&Hadoop云服务之战:微软vs.亚马逊
http://s3tools.org/s3cmd Amazon Elastic MapReduce (Amazon EMR)简介 Amazon Elastic MapReduce (Amazon EM ...
- MapReduce On Yarn的配置详解和日常维护
MapReduce On Yarn的配置详解和日常维护 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MapReduce运维概述 MapReduce on YARN的运维主要是 ...
- HADOOP之MAPREDUCE程序应用二
摘要:MapReduce程序进行单词计数. 关键词:MapReduce程序 单词计数 数据源:人工构造英文文档file1.txt,file2.txt. file1.txt 内容 Hello Ha ...
随机推荐
- PotPlayer播放器 莫尼卡汉化绿色版 V1.6.48089 32位
软件名称: PotPlayer播放器 莫尼卡汉化绿色版 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win7 / Vista / Win2003 / WinXP 软件大小: 10.5MB ...
- js的兼容技巧
javascript原生代码中经常会遇到各式各样浏览器不兼容的问题,浏览器真是倔强,解决浏览器的兼容是前端猿们的一大难题 为了避免在工作中遇到这些简单的问题.节约开发时间,在这里总结一些常用的浏览器兼 ...
- C#拾遗(二、函数)
1. 参数数组.C#的特色,允许函数参数的最后指定一个参数数组,可以使用个数不定的参数调用,用params关键字定义 static double SumVals(params double[] val ...
- asp.net 后台验证成功(弹出对话框)并跳转?不能实现
原始 Context.Response.Write("<script></script>"); Response.Redirect(); 解决办法: Cli ...
- iOS身份证号码识别
一.前言 身份证识别,又称OCR技术.OCR技术是光学字符识别的缩写,是通过扫描等光学输入方式将各种票据.报刊.书籍.文稿及其它印刷品的文字转化为图像信息,再利用文字识别技术将图像信息转化为可以使 ...
- cuda8.0环境下安装py-faster-rcnn问题总结
首先声明,由于之前安装的cuda8.0,在实践中出现各种问题,这里不是指安装环境问题,而是在训练模型是会阻止内核启动,因此让我不得不转战8.0,说出来都是泪啊,配个环境都配了一个礼拜了,所以,请不要轻 ...
- 通过HttpModule管道,帮助api对接开发
我们公司的技术以.net为主,最近公司的项目需要和其它以java为主的公司搞对接. .net提供webapi由java请求调用. 目前出现java说调用了,但是.net一直接收不到数据.两方开发人 ...
- BOS物流管理系统-第五天
BOS物流管理系统-第五天-定区管理-WebServcie远程调用 主要内容: 分区设置-导出(分区条件查询后的结果导出为Excel-POI生成Excel和文件下载) 定区管理---定区添加(定区关联 ...
- ImageView.ScaleType设置图解
图文相配很清晰的看出每个属性的效果, 感觉 CENTER_CROP 比较有用,长宽自动适应 ImageView ,整个图片自动缩略填充整个区域且居中显示(高宽不一定是view的尺寸),以前用JS在网页 ...
- jquery.validationEngine
引入库文件 <!DOCTYPE html> <head> <!--jQuery--> <script type="text/javascript&q ...