MapReduce辅助排序
需求:订单数据
求出每个订单中最贵的商品?
订单id正序,成交金额倒序。
结果文件三个,每个结果文件只要一条数据。
1.Mapper类
package com.css.order.mr; import java.io.IOException; import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper; public class OrderMapper extends Mapper<LongWritable, Text, OrderBean, NullWritable>{ @Override
protected void map(LongWritable key, Text value,Context context)
throws IOException, InterruptedException {
// 获取每行数据
String line = value.toString();
// 切分数据
String[] fields = line.split("\t");
// 取出字段
Integer order_id = Integer.parseInt(fields[0]);
Double price = Double.parseDouble(fields[2]);
OrderBean orderBean = new OrderBean(order_id, price);
// 输出
context.write(orderBean, NullWritable.get());
}
}
2.Reducer类
package com.css.order.mr; import java.io.IOException; import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.mapreduce.Reducer; public class OrderReducer extends Reducer<OrderBean, NullWritable, OrderBean, NullWritable>{
@Override
protected void reduce(OrderBean key, Iterable<NullWritable> values,
Context context)throws IOException, InterruptedException {
// 输出
context.write(key, NullWritable.get());
}
}
3.封装类
package com.css.order.mr; import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException; import org.apache.hadoop.io.WritableComparable; public class OrderBean implements WritableComparable<OrderBean>{ // 定义属性
private int order_id; // 定义订单id
private double price; // 价格 public OrderBean(){
} public OrderBean(int order_id, double price) {
super();
this.order_id = order_id;
this.price = price;
} public int getOrder_id() {
return order_id;
} public void setOrder_id(int order_id) {
this.order_id = order_id;
} public double getPrice() {
return price;
} public void setPrice(double price) {
this.price = price;
} // 序列化
@Override
public void write(DataOutput out) throws IOException {
out.writeInt(order_id);
out.writeDouble(price);
} // 反序列化
@Override
public void readFields(DataInput in) throws IOException {
order_id = in.readInt();
price = in.readDouble();
} @Override
public String toString() {
return order_id + "\t" + price;
} // 排序
@Override
public int compareTo(OrderBean o) {
int rs;
// 根据id排序
if (order_id > o.order_id) {
// id 大的往下排
rs = 1;
}else if (order_id < o.order_id) {
// id小的往上排
rs = -1;
}else {
// id相等 价格高的往上排
rs = price > o.getPrice() ? -1 : 1;
}
return rs;
} }
4.自定义分区类
package com.css.order.mr; import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.mapreduce.Partitioner; public class OrderPartitioner extends Partitioner<OrderBean, NullWritable>{ @Override
public int getPartition(OrderBean key, NullWritable value, int numPartitions) {
return (key.getOrder_id() & Integer.MAX_VALUE) % numPartitions;
}
}
5.自定义排序分组类
package com.css.order.mr; import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator; public class OrderGroupingComparator extends WritableComparator{ // 构造必须加
protected OrderGroupingComparator() {
super(OrderBean.class, true);
} // 重写比较
@Override
public int compare(WritableComparable a, WritableComparable b) {
OrderBean aBean = (OrderBean) a;
OrderBean bBean = (OrderBean) b;
int rs;
// id不同不是同一对象
if (aBean.getOrder_id() > bBean.getOrder_id()) {
rs = 1;
}else if (aBean.getOrder_id() < bBean.getOrder_id()) {
rs = -1;
}else {
rs = 0;
}
return rs;
}
}
6.Driver类
package com.css.order.mr; import java.io.IOException; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class OrderDriver {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
// 1.获取job信息
Configuration conf = new Configuration();
Job job = Job.getInstance(conf); // 2.获取jar包
job.setJarByClass(OrderDriver.class); // 3.获取mapper与reducer
job.setMapperClass(OrderMapper.class);
job.setReducerClass(OrderReducer.class); // 4.定义mapper输出类型
job.setMapOutputKeyClass(OrderBean.class);
job.setMapOutputValueClass(NullWritable.class); // 5.定义reducer输出类型
job.setOutputKeyClass(OrderBean.class);
job.setOutputValueClass(NullWritable.class); // 6.设置reducer端的分组
job.setGroupingComparatorClass(OrderGroupingComparator.class); // 7.设置分区
job.setPartitionerClass(OrderPartitioner.class); // 8.设置reduceTask个数
job.setNumReduceTasks(3); // 9.设置数据的输入与输出
FileInputFormat.setInputPaths(job, new Path("c://in1026"));
FileOutputFormat.setOutputPath(job, new Path("c://out1026")); // 10.提交任务
boolean rs = job.waitForCompletion(true);
System.out.println(rs ? 0 : 1);
}
}
7.mr输入文件order.java
1001 Tmall_01 998
1001 Tmall_06 88.8
1001 Tmall_03 522.8
1002 Tmall_03 522.8
1002 Tmall_04 132.4
1002 Tmall_05 372.4
1003 Tmall_01 998
1003 Tmall_02 8.5
1003 Tmall_04 132.4
8.输出文件
(1)part-r-00000
1002 522.8
(2)part-r-00001
1003 998.0
(3)part-r-00002
1001 998.0
MapReduce辅助排序的更多相关文章
- hadoop MapReduce辅助排序解析
1.数据样本,w1.csv到w5.csv,每个文件数据样本2000条,第一列是年份从1990到2000随机,第二列数据从1-100随机,本例辅助排序目标是找出每年最大值,实际上结果每年最大就是100, ...
- 辅助排序和Mapreduce整体流程
一.辅助排序 需求:先有一个订单数据文件,包含了订单id.商品id.商品价格,要求将订单id正序,商品价格倒序,且生成结果文件个数为订单id的数量,每个结果文件中只要一条该订单最贵商品的数据. 思路: ...
- Mapreduce的排序(全局排序、分区加排序、Combiner优化)
一.MR排序的分类 1.部分排序:MR会根据自己输出记录的KV对数据进行排序,保证输出到每一个文件内存都是经过排序的: 2.全局排序: 3.辅助排序:再第一次排序后经过分区再排序一次: 4.二次排序: ...
- Hadoop案例(八)辅助排序和二次排序案例(GroupingComparator)
辅助排序和二次排序案例(GroupingComparator) 1.需求 有如下订单数据 订单id 商品id 成交金额 0000001 Pdt_01 222.8 0000001 Pdt_05 25.8 ...
- MapReduce-排序(全部排序、辅助排序)
排序 排序是MapReduce的核心技术. 1.准备 示例:按照气温字段对天气数据集排序.由于气温字段是有符号的整数,所以不能将该字段视为Text对象并以字典顺序排序.反之,用顺序文件存储数据,其In ...
- MapReduce --全排序
MapReduce全排序的方法1: 每个map任务对自己的输入数据进行排序,但是无法做到全局排序,需要将数据传递到reduce,然后通过reduce进行一次总的排序,但是这样做的要求是只能有一个red ...
- hadoop笔记之MapReduce的应用案例(利用MapReduce进行排序)
MapReduce的应用案例(利用MapReduce进行排序) MapReduce的应用案例(利用MapReduce进行排序) 思路: Reduce之后直接进行结果合并 具体样例: 程序名:Sort. ...
- Hadoop基础-MapReduce的排序
Hadoop基础-MapReduce的排序 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MapReduce的排序分类 1>.部分排序 部分排序是对单个分区进行排序,举个 ...
- MapReduce之GroupingComparator分组(辅助排序、二次排序)
指对Reduce阶段的数据根据某一个或几个字段进行分组. 案例 需求 有如下订单数据 现在需要找出每一个订单中最贵的商品,如图 需求分析 利用"订单id和成交金额"作为key,可以 ...
随机推荐
- CSS学习笔记(11)--Flex 布局教程:语法篇
原文--阮一峰博客 作者: 阮一峰 日期: 2015年7月10日 网页布局(layout)是CSS的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 ...
- /usr/bin/ld: cannot find -lc错误原因及解决方法
问题解决 我在执行如下命令的时候,出现了错误. gcc -o main main.c -static -L. –lmylib Linux环境下gcc静态编译/usr/bin/ld: cannot fi ...
- Okra框架(二) 搭建Socket服务器
本文将介绍使用Okra框架帮助开发者快速搭建高性能应用程序Socket服务端. 博主接触的网络游戏(包含但不限于网页, 手机)的服务端通信使用的协议基本上就Socket,Http或是WebSocket ...
- [android] AndroidManifest.xml - 【 manifest -> Application -> activity 】
<activity android:allowTaskReparenting=["true" | "false"] android:alwaysRetai ...
- Ubuntu之No module named cv2
最简单的方法是:pip install opencv-python 另外,从源码安装的方法: 1下载opencv源码:http://opencv.org/releases.html 推荐2.4.13 ...
- 第二百五十四节,Bootstrap项目实战--案例
Bootstrap项目实战--案例 html <!DOCTYPE html> <html lang="zh-cn"> <head> <me ...
- Linux下面变量的疑问处
SHLVL是Shell累加器的变量,具体请看下面 http://www.cnblogs.com/ziyunfei/p/4803832.html OLDPWD = old pwd(就是是之前一次的pwd ...
- SQL语句:语法错误(操作符丢失)在查询表达式中
所谓操作符丢失,应该是你在拼接SQL语句是少了关键词或者分隔符,导致系统无法识别SQL语句.建议:1.监控SQL语句,看看哪里出现问题:断点看下最后的sql到底是什么样子就知道了,另外你可以把这段sq ...
- JZOJ.5326【NOIP2017模拟8.21】LCA 的统计
Description
- 那个你经常用的abs函数(取绝对值)真的总是返回非负数吗?
前几天在牛客网看到一道关于abs()函数返回值的题目,见下图,当时还没反应过来,第一反应是:自从我开始学C语言,就知道它是用来求int数的绝对值的,返回值当然是0或者正数啊,一看答案就是A. 后来思来 ...