一、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的更多相关文章

  1. Mapjoin和Reducejoin案例

    一.Mapjoin案例 1.需求:有两个文件,分别是订单表.商品表, 订单表有三个属性分别为订单时间.商品id.订单id(表示内容量大的表), 商品表有两个属性分别为商品id.商品名称(表示内容量小的 ...

  2. 使用MapReduce实现join操作

     在关系型数据库中,要实现join操作是非常方便的,通过sql定义的join原语就可以实现.在hdfs存储的海量数据中,要实现join操作,可以通过HiveQL很方便地实现.不过HiveQL也是转化成 ...

  3. MapReduce(四) 典型编程场景(二)

    一.MapJoin-DistributedCache 应用 1.mapreduce join 介绍 在各种实际业务场景中,按照某个关键字对两份数据进行连接是非常常见的.如果两份数据 都比较小,那么可以 ...

  4. Reducejoin sample

    示例文件同sample join analysis 之前的示例是使用map端的join.这次使用reduce端的join. 根据源的类别写不同的mapper,处理不同的文件,输出的key都是stude ...

  5. [Hive优化] 之 MapJoin

    根据mapjoin的计算原理,MAPJION会把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配.这种情况下即使笛卡尔积也不会对任务运行速度造成太大的效率影响. mapjoi ...

  6. Hive MapJoin

    摘要 MapJoin是Hive的一种优化操作,其适用于小表JOIN大表的场景,由于表的JOIN操作是在Map端且在内存进行的,所以其并不需要启动Reduce任务也就不需要经过shuffle阶段,从而能 ...

  7. hive中与hbase外部表join时内存溢出(hive处理mapjoin的优化器机制)

    与hbase外部表(wizad_mdm_main)进行join出现问题: CREATE TABLE wizad_mdm_dev_lmj_edition_result as select *  from ...

  8. 大数据入门第九天——MapReduce详解(五)mapJoin、GroupingComparator与更多MR实例

    一.数据倾斜分析——mapJoin 1.背景 接上一个day的Join算法,我们的解决join的方式是:在reduce端通过pid进行串接,这样的话: --order ,,P0001, ,,P0001 ...

  9. MR案例:Map-Join

    适用场景:一张表十分小[key不可重复].一张表非常大. 用法:在Job提交时,首先将小表加载到 DistributedCache 分布式缓存中,然后从DistributeCache中读取小表解析成 ...

随机推荐

  1. db2 连接报错connect。 ERRORCODE=-4499, SQLSTATE=08001(转载)

    在使用data studio连接远程DB2数据库时报错如下: [jcc][Thread:main][SQLException@5b775b77] java.sql.SQLException [jcc] ...

  2. Android——RelativeLayout(相对布局)

    一.相对于父容器 1.居中 2.同方向 <?xml version="1.0" encoding="utf-8"?> <RelativeLay ...

  3. Maven基础命令

    Maven 参数 -D 传入属性参数 -P 使用pom中指定的配置 -e 显示maven运行出错的信息 -o 离线执行命令,即不去远程仓库更新包 -X 显示maven允许的debug信息 -U 强制去 ...

  4. shiro配置unauthorizedUrl,无权限抛出无权限异常,但是不跳转

    在使用shiro配置无授权信息的url的时候,发现这样的一个scenario,配置好unauthorizedUrl后仍然无法跳转,然后就在网上开始找,找了原因以及解决方案 原因,先post一个源码: ...

  5. 修改多渠道打包的App名

    archiveNameFormat = '${flavorName}-${projectName}-${versionName}-${versionCode}'

  6. 使用PULL解析XML文件

    转载博文1:http://blog.csdn.net/wangkuifeng0118/article/details/7313241 XmlPull和Sax类似,是基于流(stream)操作文件,然后 ...

  7. php -- ziparchive::open创建zip压缩文件

    语法: mixed ZipArchive::open ( string $filename [, int $flags ] ) 参数: filename:创建的zip的文件名 flags: ZIPAR ...

  8. mysql -- 存储过程中 declare 和 set 定义变量的区别

    mysql存储过程中,定义变量有两种方式:1.使用set或select直接赋值,变量名以 @ 开头.例如:set @var=1;可以在一个会话的任何地方声明,作用域是整个会话,称为会话变量. 2.以 ...

  9. 【BZOJ】1022: [SHOI2008]小约翰的游戏John(博弈论)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1022 好神的博弈论. 题解见dzy的blog:http://dzy493941464.is-prog ...

  10. 【vijos】1164 曹冲养猪(中国剩余定理)

    https://vijos.org/p/1164 好赞orz. 对于求一组线性同余方程 x=a[i](mod m[i]) 这里任意两个m[i]和m[j]都互质 那么可以用中国剩余定理来做. 对中国剩余 ...