目录

  • 排序
    • 排序的分类
    • 自定义排序
  • 数据预处理
  • 全排序与区排序
    • 全排序
      • 重写Bean类
      • 编写Mapper类
      • 编写Reduce类
      • 编写Driver类
      • 结果
    • 区排序
      • 重写Partition
      • 编写Driver类
      • 运行结果

排序

排序的分类

  • 部分排序:MapReduce根据输入记录的键对数据集排序保证输出的每个文件内部有序。
  • 全排序:最终输出结果只有一个文件,且文件内部有序。实现方式是只设置一个ReduceTask。但该方法在处理大型文件时效率极低,因为一台机器处理所有文件,完全丧失了MapReduce所提供的并行框架。
  • 区排序:在Reduce端对key进行分组。应用于:在接收的key为bean对象时,想让一个活几个字段相同(全部字段比较不相同)的key进入到同一个reduce方法时,可以采用分组排序。
  • 二次排序:在自定义排序过程中,如果compareTo中的判断条件为两个即为二次排序。

自定义排序

bean对象做为key传输,需要实现WritableComparable接口重写compareTo方法

@Override
public int compareTo(FlowBean o) {int result;   // 对总流量大小倒序排序if (sumFlow > bean.getSumFlow()) {result = -1;}else if (sumFlow < bean.getSumFlow()) {result = 1;}else {result = 0;}return result;
}

数据预处理

使用之前的数据

13736230513  192.196.100.1   www.isea.com    2481    24681   200
13846544121 192.196.100.2           264 0   200
13956435636 192.196.100.3           132 1512    200
13966251146 192.168.100.1           240 0   404
18271575951 192.168.100.2   www.isea.com    1527    2106    200
11184188413 192.168.100.3   www.isea.com    4116    1432    200
13590439668 192.168.100.4           1116    954 200
15910133277 192.168.100.5   www.hao123.com  3156    2936    200
13729199489 192.168.100.6           240 0   200
13630577991 192.168.100.7   www.shouhu.com  6960    690 200
15043685818 192.168.100.8   www.baidu.com   3659    3538    200
15959002129 192.168.100.9   www.isea.com    1938    180 500
15043685818 192.168.2.8 www.baidu.com   3659    3538    200
15959002129 192.168.2.9 www.hao123.com  1938    180 500
13560439638 192.168.2.10            918 4938    200
13470253144 192.168.2.11            180 180 200
13682846555 192.168.2.12    www.qq.com  1938    2910    200
13992314666 192.168.2.13    www.gaga.com    3008    3720    200
13509468723 192.168.2.14    www.qinghua.com 7335    110349  404
18390173782 192.168.2.15    www.sogou.com   9531    2412    200
13975057813 192.168.2.16    www.baidu.com   11058   48243   200
13768778790 192.168.2.17            120 120 200
13568436656 192.168.2.18    www.alibaba.com 2481    24681   200
13568436656 192.168.2.19            1116    954 200
15043685818 192.168.100.8   www.baidu.com   3659    3538    200
15959002129 192.168.100.9   www.isea.com    1938    180 500
13560439638 192.168.100.10          918 4938    200
13470253144 192.168.100.11          180 180 200
13682846555 192.168.100.12  www.qq.com  1938    2910    200
13992314666 192.168.100.13  www.gaga.com    3008    3720    200
13509468723 192.168.100.14  www.qinghua.com 7335    110349  404
18390173782 192.168.100.15  www.sogou.com   9531    2412    200
13975057813 192.168.100.16  www.baidu.com   11058   48243   200

对这些数据先序列化处理,处理如下

11184188413  4116    1432    5548
13470253144 360 360 720
13509468723 14670   220698  235368
13560439638 1836    9876    11712
13568436656 3597    25635   29232
13590439668 1116    954 2070
13630577991 6960    690 7650
13682846555 3876    5820    9696
13729199489 240 0   240
13736230513 2481    24681   27162
13768778790 120 120 240
13846544121 264 0   264
13956435636 132 1512    1644
13966251146 240 0   240
13975057813 22116   96486   118602
13992314666 6016    7440    13456
15043685818 10977   10614   21591
15910133277 3156    2936    6092
15959002129 5814    540 6354
18271575951 1527    2106    3633
18390173782 19062   4824    23886

可以看出数据排列顺序是乱序为了使数据的排序有一定的规律我们对其进行全排序和区排序

全排序与区排序

实现目的:根据总流量以从大到小的形式进行排序

 电话号  上行流量   下行流量            总流量
13509468723   14670     220698          235368
13568436656   3597      25635           29232
13560439638   1836      9876            11712
...
...
...

全排序

基本步骤:

  • 输入相关的数据
  • Bean类实现WritableComparable接口重写compareTo方法
  • 编写mapper类
  • 编写reduce类
  • 编写driver类

重写Bean类

package WritableComparable;
/*** @author 公羽* @time : 2020/11/1 14:43* @File : FlowBean.java*/
import org.apache.hadoop.io.WritableComparable;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
public class FlowBean implements WritableComparable<FlowBean> {private Long upFlow;private Long downFlow;private Long sumFlow;public FlowBean() {}public FlowBean(Long upFlow, Long downFlow) {this.upFlow = upFlow;this.downFlow = downFlow;this.sumFlow = upFlow + downFlow;}@Overridepublic void write(DataOutput out) throws IOException {out.writeLong(upFlow);out.writeLong(downFlow);out.writeLong(sumFlow);}@Overridepublic void readFields(DataInput in) throws IOException {upFlow = in.readLong();downFlow = in.readLong();sumFlow = in.readLong();}@Overridepublic String toString() {return  upFlow + "\t" + downFlow +  "\t" + sumFlow ;}@Overridepublic int compareTo(FlowBean o) {if (sumFlow > o.getSumFlow()){return -1;}else if (sumFlow < o.getSumFlow()){return  1;}else {return 0;}}public Long getUpFlow() {return upFlow;}public void setUpFlow(Long upFlow) {this.upFlow = upFlow;}public Long getDownFlow() {return downFlow;}public void setDownFlow(Long downFlow) {this.downFlow = downFlow;}public Long getSumFlow() {return sumFlow;}public void setSumFlow(Long sumFlow) {this.sumFlow = sumFlow;}
}

编写Mapper类

package WritableComparable;
/*** @author 公羽* @time : 2020/11/1 14:45* @File : SortMapper.java*/
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
public class SortMapper extends Mapper<LongWritable, Text, FlowBean, Text> {FlowBean k = new FlowBean();Text v = new Text();@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {//获取一行String line = value.toString();//切割数据String[] splits = line.split("\t");//封装对象v.set(splits[0]);k.setUpFlow(Long.valueOf(splits[1]));k.setDownFlow(Long.valueOf(splits[2]));k.setSumFlow(Long.valueOf(splits[3]));//写出context.write(k, v);}
}

编写Reduce类

package WritableComparable;
/*** @author 公羽* @time : 2020/11/1 14:50* @File : SortReducer.java*/
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;public class SortReducer extends Reducer<FlowBean, Text,Text,FlowBean> {@Overrideprotected void reduce(FlowBean key, Iterable<Text> values, Context context) throws IOException, InterruptedException {//        循环写入for (Text value : values) {context.write(value,key);}}
}

编写Driver类

package WritableComparable;
/*** @author 公羽* @time : 2020/11/1 14:55* @File : SortDriver.java*/
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
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;
import java.io.IOException;public class SortDriver {public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {// 1 获取配置信息,或者job对象实例Configuration configuration = new Configuration();Job job = Job.getInstance(configuration);// 2 指定本业务job要使用的Driver类job.setJarByClass(SortDriver.class);// 3 指定本业务job要使用的mapper/Reducer类job.setMapperClass(SortMapper.class);job.setReducerClass(SortReducer.class);// 4 指定mapper输出数据的kv类型job.setMapOutputKeyClass(FlowBean.class);job.setMapOutputValueClass(Text.class);// 5 指定最终输出的数据的kv类型job.setOutputKeyClass(Text.class);job.setOutputValueClass(FlowBean.class);// 6 指定job的输入原始文件所在目录FileInputFormat.setInputPaths(job,new Path("E:\\hadoop\\mapreducedemo\\so_input\\part-r-00000.txt"));FileOutputFormat.setOutputPath(job,new Path("E:\\hadoop\\mapreducedemo\\So_output"));// 7 将job中配置的相关参数,以及job所用的java类所在的jar包, 提交给yarn去运行boolean re = job.waitForCompletion(true);System.exit(re ? 0 : 1);}
}

结果

区排序

区排序就是将分区里面的数据进行排序

重写Partition

package WritableComparable2;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Partitioner;/*** @author 公羽* @time : 2020/11/1 16:47* @File : Partitioner2.java*/
public class Partitioner2 extends Partitioner<WritableComparable.FlowBean, Text> {@Overridepublic int getPartition(WritableComparable.FlowBean flowBean, Text text, int numPartitions) {switch (text.toString().substring(0, 3)) {case "159":return 0;case "135":return 1;case "138":return 2;case "139":return 3;default:return 4;}}
}

编写Driver类

package WritableComparable2;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
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;import java.io.IOException;
/*** @author 公羽* @time : 2020/11/1 16:51* @File : SortDriver.java*/
public class SortDriver {public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {Job job = Job.getInstance(new Configuration());job.setJarByClass(WritableComparable2.SortDriver.class);job.setMapperClass(WritableComparable.SortMapper.class);job.setReducerClass(WritableComparable.SortReducer.class);job.setMapOutputKeyClass(WritableComparable.FlowBean.class);job.setMapOutputValueClass(Text.class);job.setPartitionerClass(Partitioner2.class);job.setNumReduceTasks(5);job.setOutputKeyClass(Text.class);job.setOutputValueClass(WritableComparable.FlowBean.class);FileInputFormat.setInputPaths(job, new Path("E:\\hadoop\\mapreducedemo\\so_input\\part-r-00000.txt"));FileOutputFormat.setOutputPath(job, new Path("E:\\hadoop\\mapreducedemo\\So_output2"));boolean b = job.waitForCompletion(true);System.exit(b ? 0 : 1);}
}

运行结果

Hadoop实例学习(八)全排序和区排序相关推荐

  1. 数据结构(八):排序 | 插入排序 | 希尔排序 | 冒泡排序 | 快速排序 | 简单选择排序 | 堆排序 | 归并排序 | 基数排序 | 外部排序 | 败者树 | 置换-选择排序 | 最佳归并树

    文章目录 第八章 排序 一.排序的基本概念 (一)什么是排序 (二)排序的应用 (三)排序算法的评价指标 (四)排序算法的分类 (五)总结 二.插入排序 (一)算法思想 (二)算法实现 (三)算法效率 ...

  2. 八十八、Python | 十大排序算法系列(下篇)

    @Author:Runsen @Date:2020/7/10 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  3. Hadoop学习笔记—11.MapReduce中的排序和分组

    Hadoop学习笔记-11.MapReduce中的排序和分组 一.写在之前的 1.1 回顾Map阶段四大步骤 首先,我们回顾一下在MapReduce中,排序和分组在哪里被执行: 从上图中可以清楚地看出 ...

  4. 《MySQL——order by逻辑(全字段排序与rowid排序)》

    创建一个表,然后使用查询语句: 查询城市是"杭州"的所有人名字,并且按照姓名排序返回前 1000 个人的姓名.年龄 create table 't' ('id' int(11) n ...

  5. 超全十大经典排序算法及其分析

    文章目录 0.算法概述 0.1 算法分类 0.2 算法复杂度 0.3 相关概念 1. 冒泡排序(Bubble Sort) 1.1 算法描述: 1.2 图解演示 1.3 代码实现 1.4 优化过程 1. ...

  6. MySql 你知道 order by 是怎么回事吗? MySql全字段排序与 rowid 排序

    志在巅峰的攀登者,不会陶醉在沿途的某个脚印之中,在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的 ...

  7. 排序算法,最全的10大排序算法详解(Sort Algorithm)

    文章目录 排序算法,最全的10大排序算法详解(Sort Algorithm) 排序算法分类 排序算法稳定性 时间复杂度(time complexity) 1#时间复杂度的意义 2#基本操作执行次数 如 ...

  8. 八张图表示八大排序算法

    算法一:插入排序 插入排序示意图 插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法二:希尔排序 希尔排序示意图 ...

  9. <<数据结构中最全的8种排序算法总结>>

    数据结构中最全的8种排序算法总结 1.插入排序 代码如下: 2.希尔排序 代码如下: 3.选择排序 代码如下: 4.堆排序 代码如下: 5.冒泡排序 代码如下: 6.快速排序 代码如下: 7.归并排序 ...

最新文章

  1. POJ 1236 Network of Schools(tarjan)
  2. php种loop用法,PHP EvLoop 用法 手册 | 示例代码
  3. 全球及中国天然肠衣行业投资盈利分析及竞争格局展望报告2022-2027年
  4. Maven-学习笔记03【基础-Maven标准目录结构和常用命令】
  5. centos rpm mysql 5.6_centos6.5 mysql5.6 RPM安装
  6. ElasticSearch入门篇
  7. Python报错SyntaxError: (unicode error) ‘utf-8‘ codec can‘t decode byte 0xc5 in position 0: invalid
  8. [NOIP2010]关押罪犯
  9. Firefox 新版本发布,Cookie 可真不好吃
  10. 【路径规划】基于matlab A_star算法求解机器人栅格地图最短路径规划问题【含Matlab源码 1388期】
  11. 屏幕录像专家限制录像时长_著名的Rails屏幕录像获取更新
  12. CRAFT字符检测算法和SynthText合成文本数据集
  13. 牛客笔试OJ-在线编辑器输入输出总结
  14. ECE与计算机相关吗,ECE(电子和计算机工程)相关专业的申请经验分享
  15. mybatis查询更新
  16. 未连接到互联网错误的解决方案
  17. 网络(十三)之ACL的高级应用
  18. java出现次数最多的字母_java计算给定字符串中出现次数最多的字母和该字
  19. vue 预览、下载pdf
  20. qq飞车显示62目录服务器连接失败,[公告] QQ飞车游戏客户端无法登陆解决方法...

热门文章

  1. 崛起的云平台,彰显信息国产化的中国力量
  2. Python爬虫:最牛逼的 selenium爬取方式!
  3. 外卖CPS小程序部署指南,个人获取美团外卖小程序跳转链接
  4. 如何快速准确的验证QQ邮箱是否开通,是否存在?
  5. 我想把生活折腾成自己想要的样子
  6. From Nand to Tetris Week2 2021 超详细笔记
  7. JAVA SE 13快速安装
  8. python爱心代码简单教程
  9. js:为窗口盒子添加拖拽事件
  10. 日记记事本java实训,黑马学习日记  GUI实现简单记事本功能