MR案例:Reduce-Join

问题描述:两种类型输入文件:address(地址)和company(公司)进行一对多的关联查询,得到地址名(例如:Beijing)与公司名(例如:Beijing JD、Beijing Red Star)的关联信息。可参考MR案例:Map-Join
1.map阶段:对比之前的单表关联可知,reduce阶段的key必须为关联两表的key,即address.Id = company.Id。则两表经过map处理输出的key必须是Id。
Class Map<LongWritable, Text, LongWritable, Text>{
method map(){
// 获取文件的每一行数据,并以":"分割
String[] line = value.toString().split(":");
//split对应的文件名
String fileName = ((FileSplit) context.getInputSplit()).getPath().getName();
//处理company文件的value信息:"Beijing Red Star:1"
if (path.indexOf("company") >= 0){
//<key,value> --<"1","company:Beijing Red Star">
context.write(new LongWritable(line[1]), new Text("company" + ":" + line[0]));
}
//处理adress文件的value信息:"1:Beijing"
else if (path.indexOf("address") >= 0){
//<key,value> --<"1","address:Beijing">
context.write(new LongWritable(line[0]), new Text("address" + ":" + line[1]));
}
}
}
2.reduce阶段:首先对输入<key, values>即<”1”,[“company:Beijing Red Star”,”company:Beijing JD”,”address:Beijing”]>的values值进行遍历获取到单元信息value(例如”company:Beijing Red Star”),然后根据value中的标识符(company和address)将公司名和地址名分别存入到company集合和address集合,最后对company集合和address集合进行笛卡尔积运算得到company与address的关系,并进行输出。
Class Reducer<LongWritable, Text, Text, Text>{
method reduce(){
//用来存储 company 和 address 的集合
List<String> companys = new ArrayList<String>();
List<String> addresses = new ArrayList<String>();
for(Text text : v2s){
String[] result = text.toString().split(":");
//以 company 开头的value存储到 company 集合中
if(result[0].equals("company")){
companys.add(result[1]);
}
//以 address 开头的value存储到 address 集合中
else if(result[0].equals("address")){
addresses.add(result[1]);
}
}
/**
* 如果只判断左表addresses.size()!=0;则转化为 左外连接 --> LEFT OUTER JOIN
* 如果只判断右表companys.size()!=0;则转化为 右外连接 --> RIGHT OUTER JOIN
* 左右都不判断,则转化为 全外连接 --> FULL OUTER JOIN
*/
// 求笛卡尔积
if(0 != companys.size()&& 0 != addresses.size()){
for(int i=0;i<companys.size();i++){
for(int j=0;j<addresses.size();j++){
//<key,value>--<"Beijing JD","Beijing">
context.write(new Text(companys.get(i)), new Text(addresses.get(j)));
}
}
}
}
}
MR案例:Reduce-Join的更多相关文章
- Hadoop学习之路(二十一)MapReduce实现Reduce Join(多个文件联合查询)
MapReduce Join 对两份数据data1和data2进行关键词连接是一个很通用的问题,如果数据量比较小,可以在内存中完成连接. 如果数据量比较大,在内存进行连接操会发生OOM.mapredu ...
- MR案例:倒排索引
1.map阶段:将单词和URI组成Key值(如“MapReduce :1.txt”),将词频作为value. 利用MR框架自带的Map端排序,将同一文档的相同单词的词频组成列表,传递给Combine过 ...
- MapReduce编程之Reduce Join多种应用场景与使用
在关系型数据库中 Join 是非常常见的操作,各种优化手段已经到了极致.在海量数据的环境下,不可避免的也会碰到这种类型的需求, 例如在数据分析时需要连接从不同的数据源中获取到数据.不同于传统的单机模式 ...
- MR案例:小文件处理方案
HDFS被设计来存储大文件,而有时候会有大量的小文件生成,造成NameNode资源的浪费,同时也影响MapReduce的处理效率.有哪些方案可以合并这些小文件,或者提高处理小文件的效率呢? 1). 所 ...
- MapReduce之Reduce Join
一 介绍 Reduce Join其主要思想如下: 在map阶段,map函数同时读取两个文件File1和File2,为了区分两种来源的key/value数据对,对每条数据打一个标签(tag), 比如:t ...
- MR案例:CombineFileInputFormat
CombineFileInputFormat是一个抽象类.Hadoop提供了两个实现类CombineTextInputFormat和CombineSequenceFileInputFormat. 此案 ...
- MR案例:倒排索引 && MultipleInputs
本案例采用 MultipleInputs类 实现多路径输入的倒排索引.解读:MR多路径输入 package test0820; import java.io.IOException; import j ...
- MR案例:输出/输入SequenceFile
SequenceFile文件是Hadoop用来存储二进制形式的key-value对而设计的一种平面文件(Flat File).在SequenceFile文件中,每一个key-value对被看做是一条记 ...
- MR案例:外连接代码实现
[外连接]是在[内连接]的基础上稍微修改即可.具体HQL语句详见Hive查询Join package join.map; import java.io.IOException; import java ...
随机推荐
- MapReduce辅助排序
需求:订单数据 求出每个订单中最贵的商品? 订单id正序,成交金额倒序. 结果文件三个,每个结果文件只要一条数据. 1.Mapper类 package com.css.order.mr; import ...
- 模拟hadoop-rpc通信
一.RPC服务类 package com.css.rpc.server; import java.io.IOException; import org.apache.hadoop.HadoopIlle ...
- Linux chmod命令
chmod用于管理文件或目录的权限,文件或目录权限的控制分别以读取(r).写入(w).执行(x)3种 可读可写可执行,抽象的用二进制来表示 1 代表拥有该权限,0 代表没有该权限,这样我们就可以看到 ...
- docker部署oracle
oracle部署 创建oracle用户 [root@stpass-15 ~]# useradd oracle[root@stpass-15 oracle]# cd oracle [root@stpas ...
- CentOS 6.4中yum安装配置LAMP服务器(Apache+MySQL+PHP5)
准备篇: 1.配置防火墙,开启80端口.3306端口 vim /etc/sysconfig/iptables -A INPUT -m state --state NEW -m tcp -p tcp ...
- 脚本其实很简单-windows配置核查程序(1)
先上成品图 需求描述 我们电脑上都安装各种过监控软件,比如360.鲁大师等等...其中有一个功能就是性能监控,在安全行业里面通常叫做"配置核查",目的就是将主机的各种性能指标展示, ...
- TensorFlow学习笔记(四)图像识别与卷积神经网络
一.卷积神经网络简介 卷积神经网络(Convolutional Neural Network,CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现. ...
- hash 冲突及解决办法。
hash 冲突及解决办法. 关键字值不同的元素可能会映象到哈希表的同一地址上就会发生哈希冲突.解决办法: 1)开放定址法:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列.沿 ...
- visual studio NuGet
http://www.cnblogs.com/dudu/archive/2011/07/15/nuget.html 首先打开程序包管理器控制台:工具→Nuget程序包管理器→程序包管理器控制台 Ins ...
- Angular 笔记系列(一)项目组织与命名规范
其实使用 Angular.js 做项目已经很久了,也遇到过许多问题.其中很多问题的出现都是因为没有按照规范或者最佳实践来做,大部分原因是学的不够细,很多 tips 没 get 到,用到项目中就会出现各 ...