mapjoin与reducejoin
一、mapjoin
1.Mapper类
package com.css.mapjoin; import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap; import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper; // 思路:商品表加载到内存中 然后数据在map端输出前 进行替换
public class CacheMapper extends Mapper<LongWritable, Text, Text, NullWritable>{ HashMap<String, String> pdMap = new HashMap<>(); // 1.商品表加载到内存
@Override
protected void setup(Context context)throws IOException {
// 加载缓存文件
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("pd.txt"), "UTF-8"));
String line;
while (StringUtils.isNotEmpty(line = br.readLine())) {
// 切分
String[] fields = line.split("\t");
// 缓存
pdMap.put(fields[0], fields[1]);
}
br.close();
} // 2.map传输
@Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
// 获取数据
String line = value.toString();
// 切割
String[] fields = line.split("\t");
// 获取订单中商品id
String pid = fields[1];
// 根据订单商品id获取商品名
String pName = pdMap.get(pid);
// 拼接数据
line = line + "\t" + pName;
// 输出
context.write(new Text(line), NullWritable.get());
}
}
2.Driver类
package com.css.mapjoin; import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.NullWritable;
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; public class CacheDriver {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException, URISyntaxException {
// 1.获取job信息
Configuration conf = new Configuration();
Job job = Job.getInstance(conf);
// 2.获取jar包
job.setJarByClass(CacheDriver.class);
// 3.获取自定义的mapper与reducer类
job.setMapperClass(CacheMapper.class);
// 4.设置reduce输出的数据类型(最终的数据类型)
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(NullWritable.class);
// 5.设置输入存在的路径与处理后的结果路径
FileInputFormat.setInputPaths(job, new Path("c:/table1029/in"));
FileOutputFormat.setOutputPath(job, new Path("c:/table1029/out"));
// 6.加载缓存商品数据
job.addCacheFile(new URI("file:///c:/inputcache/pd.txt"));
// 7.设置一下reducetask的数量
job.setNumReduceTasks(0);
// 8.提交任务
boolean rs = job.waitForCompletion(true);
System.out.println(rs ? 0 : 1);
}
}
3.输入文件
(1)order.txt
201801 01 1
201802 02 2
201803 03 3
201804 01 4
201805 02 5
201806 03 6 (2)pd.txt
01 苹果
02 华为
03 小米
4.输出文件part-m-00000
201801 01 1 苹果
201802 02 2 华为
201803 03 3 小米
201804 01 4 苹果
201805 02 5 华为
201806 03 6 小米
二、reducejoin
1.Mapper类
package com.css.reducejoin; import java.io.IOException; import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileSplit; public class TableMapper extends Mapper<LongWritable, Text, Text, TableBean>{ @Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException { TableBean v = new TableBean();
Text k = new Text(); // 区分两张表
FileSplit inputSplit = (FileSplit) context.getInputSplit();
String name = inputSplit.getPath().getName(); // 获取数据
String line = value.toString(); // 区分 此时是订单表
if (name.contains("order.txt")) {
// 切分字段
String[] fields = line.split("\t");
// 封装对象
v.setOrder_id(fields[0]);
v.setPid(fields[1]);
v.setAmount(Integer.parseInt(fields[2]));
v.setpName("");
v.setFlag("0");
// 设置k 商品id作为k
k.set(fields[1]);
}else { // 此时为商品表
// 切分字段
String[] fields = line.split("\t");
// 封装对象
v.setOrder_id("");
v.setPid(fields[0]);
v.setAmount(0);
v.setpName(fields[1]);
v.setFlag("1");
// 设置k 商品id作为k
k.set(fields[0]);
}
context.write(k, v);
}
}
2.Reducer类
package com.css.reducejoin; import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList; import org.apache.commons.beanutils.BeanUtils;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer; public class TableReducer extends Reducer<Text, TableBean, TableBean, NullWritable>{ @Override
protected void reduce(Text key, Iterable<TableBean> values,
Context context) throws IOException, InterruptedException {
// 创建集合 存放订单数据
ArrayList<TableBean> orderBean = new ArrayList<TableBean>(); // 商品存储
TableBean pdBean = new TableBean(); // 把pd商品中商品名 拷贝到orderBean for (TableBean v : values) {
if ("0".equals(v.getFlag())) { // 订单表
// 1.创建一个临时变量 拷贝数据
TableBean tableBean = new TableBean();
// 2.拷贝
try {
BeanUtils.copyProperties(tableBean, v);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
orderBean.add(tableBean);
}else {
try {
BeanUtils.copyProperties(pdBean, v);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
} // 拼接表
for (TableBean tableBean : orderBean) {
// 加入商品名
tableBean.setpName(pdBean.getpName());
context.write(tableBean, NullWritable.get());
}
}
}
3.封装类
package com.css.reducejoin; import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException; import org.apache.hadoop.io.Writable; public class TableBean implements Writable{ // 封装对应字段
private String order_id; //订单id
private String pid; // 产品id
private int amount; // 产品数量
private String pName; // 产品名称
private String flag; // 判断是订单表还是商品表 public TableBean() {
super();
} public String getOrder_id() {
return order_id;
}
public void setOrder_id(String order_id) {
this.order_id = order_id;
}
public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
public String getpName() {
return pName;
}
public void setpName(String pName) {
this.pName = pName;
}
public String getFlag() {
return flag;
}
public void setFlag(String flag) {
this.flag = flag;
} @Override
public void write(DataOutput out) throws IOException {
out.writeUTF(order_id);
out.writeUTF(pid);
out.writeInt(amount);
out.writeUTF(pName);
out.writeUTF(flag);
} @Override
public void readFields(DataInput in) throws IOException {
order_id = in.readUTF();
pid = in.readUTF();
amount = in.readInt();
pName = in.readUTF();
flag = in.readUTF();
} @Override
public String toString() {
return order_id + "\t" + pName + "\t" + amount;
}
}
4.Driver类
package com.css.reducejoin; import java.io.IOException;
import java.net.URISyntaxException; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.NullWritable;
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; public class TableDriver {
public static void main(String[] args) throws IOException, URISyntaxException, ClassNotFoundException, InterruptedException {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf); job.setJarByClass(TableDriver.class); job.setMapperClass(TableMapper.class);
job.setReducerClass(TableReducer.class); job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(TableBean.class); job.setOutputKeyClass(TableBean.class);
job.setOutputValueClass(NullWritable.class); FileInputFormat.setInputPaths(job, new Path("c:/reduce1029/in"));
FileOutputFormat.setOutputPath(job, new Path("c:/reduce1029/out")); boolean rs = job.waitForCompletion(true);
System.out.println(rs ? 0 : 1);
}
}
5.输入文件
(1)order.txt
201801 01 1
201802 02 2
201803 03 3
201804 01 4
201805 02 5
201806 03 6 (2)pd.txt
01 苹果
02 华为
03 小米
6.输出文件part-r-00000
201804 苹果 4
201801 苹果 1
201805 华为 5
201802 华为 2
201806 小米 6
201803 小米 3
mapjoin与reducejoin的更多相关文章
- Mapjoin和Reducejoin案例
一.Mapjoin案例 1.需求:有两个文件,分别是订单表.商品表, 订单表有三个属性分别为订单时间.商品id.订单id(表示内容量大的表), 商品表有两个属性分别为商品id.商品名称(表示内容量小的 ...
- 使用MapReduce实现join操作
在关系型数据库中,要实现join操作是非常方便的,通过sql定义的join原语就可以实现.在hdfs存储的海量数据中,要实现join操作,可以通过HiveQL很方便地实现.不过HiveQL也是转化成 ...
- MapReduce(四) 典型编程场景(二)
一.MapJoin-DistributedCache 应用 1.mapreduce join 介绍 在各种实际业务场景中,按照某个关键字对两份数据进行连接是非常常见的.如果两份数据 都比较小,那么可以 ...
- Reducejoin sample
示例文件同sample join analysis 之前的示例是使用map端的join.这次使用reduce端的join. 根据源的类别写不同的mapper,处理不同的文件,输出的key都是stude ...
- [Hive优化] 之 MapJoin
根据mapjoin的计算原理,MAPJION会把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配.这种情况下即使笛卡尔积也不会对任务运行速度造成太大的效率影响. mapjoi ...
- Hive MapJoin
摘要 MapJoin是Hive的一种优化操作,其适用于小表JOIN大表的场景,由于表的JOIN操作是在Map端且在内存进行的,所以其并不需要启动Reduce任务也就不需要经过shuffle阶段,从而能 ...
- hive中与hbase外部表join时内存溢出(hive处理mapjoin的优化器机制)
与hbase外部表(wizad_mdm_main)进行join出现问题: CREATE TABLE wizad_mdm_dev_lmj_edition_result as select * from ...
- 大数据入门第九天——MapReduce详解(五)mapJoin、GroupingComparator与更多MR实例
一.数据倾斜分析——mapJoin 1.背景 接上一个day的Join算法,我们的解决join的方式是:在reduce端通过pid进行串接,这样的话: --order ,,P0001, ,,P0001 ...
- MR案例:Map-Join
适用场景:一张表十分小[key不可重复].一张表非常大. 用法:在Job提交时,首先将小表加载到 DistributedCache 分布式缓存中,然后从DistributeCache中读取小表解析成 ...
随机推荐
- ios界面跳转
import Foundationimport UIKit class MyViewController: UIViewController{ // var window: UIWindow? ove ...
- oracle 存储过程学习感悟
1.跟大白话差不多 2.if...then.... else ....写的比较多 3.调用存储过程命令:execute procedure_name 4.调用存储函数命令:select '0' str ...
- word字号
1 大特号 63 2 特 号 54 3 初 号 42 4 小初号 36 5 大一号 31.5 6 一 号 28 7 小一号 24 8 二 号 21 9 小二号 18 10 三 号 16 11 小三号 ...
- 实战c++中的vector系列--知道emplace_back为何优于push_back吗?
上一篇博客说道vector中放入struct.我们先构造一个struct对象.再push_back. 那段代码中,之所以不能使用emplace_back,就是由于我们定义的struct没有显示的构造函 ...
- Spring.Net框架三:使用Spring.Net框架实现多数据库
在前面的两篇文章中简单介绍了Spring.Net和如何搭建Spring.Net的环境,在本篇文章中将使用Spring.Net实现多数据库的切换. 一.建立一个空白的解决方案,名称为“SpringDot ...
- window.parent.document解决原生js或jQuery 实现父窗口的问题
做WEB前端开发的过程中,经常会有这样的需求,用户点击[编辑]按钮,弹出一个对话框,在里边修改相应的值,然后把修改后的值显示在原页面,最后点击保存. 用window.parent.document.g ...
- SQL Server 数据库同步,订阅、发布、复制、跨服务器
随便说两句 折腾了一周,也算把数据库同步弄好了.首先局域网内搭建好,进行各种测试,弄的时候各种问题,弄好以后感觉还是挺简单的.本地测试好了,又在服务器进行测试,主要的难点就是跨网段同步,最后也解决了, ...
- 如果没有指定Cookie的时效,那么默认的时效是。(选择1项)
如果没有指定Cookie的时效,那么默认的时效是.(选择1项) A.一天 B. 永不过期 C.会话级别 D.一分钟 解答:C 这是API的原文:By default, -1 indicating th ...
- 杂文 - 设计MIUI主题 的 MIUI设计师
设计MIUI主题 的 MIUI设计师 本文地址: http://blog.csdn.net/caroline_wendy 时间: 2014.6.10 By Spike. 1. 首先注冊MIUI设计师: ...
- c#并行扫描端口控制台程序
static void Main(string[] args) { Console.WriteLine("请输入ip"); string ip = Console.ReadLine ...