mapreduce对key值排序问题
来源:互联网 发布:昌荣传播知乎 编辑:程序博客网 时间:2024/06/05 18:16
最近在学习MapReduce编程遇到很多用MR实现按某一列值排序,或二次排序的类似问题,于是试着用MR实现各种排序问题,最终有点小总结:无需在key对象之外写任何排序函数,MR会完成按key值排序,具体详解如下:
在这之前要先说一下WritableComparable接口。Writable接口大家可能都知道,它是一个实现了序列化协议的序列化对象。在Hadoop中定义一个结构化对象都要实现Writable接口,使得该结构化对象可以序列化为字节流,字节流也可以反序列化为结构化对象。那WritableComparable接口是可序列化并且可比较的接口。MapReduce中所有的key值类型都必须实现这个接口,既然是可序列化的那就必须得实现readFiels()和write()这两个序列化和反序列化函数,既然也是可比较的那就必须得实现compareTo()函数,该函数即是比较和排序规则的实现。这样MR中的key值就既能可序列化又是可比较的。下面几符图是API中对WritableComparable接口的解释及其方法,还有一个实现了该接口的对象的列子:
图 一 WritableComparable 接口解释
图 二 WritableComparable 接口方法
图 三 自定义对象实现WritableComparable 接口例子
从图三可以看到自定义的对象实现WritableComparable接口除了实现readFields和write方法之外,还必须得实现compareTo()方法,这也是key值排序的关键,实现了改方法key值之间是可比较可排序的,所以也不用另外写排序函数了。Hadoop提供的数据类型如Text,IntWritable,LongWritable,DoubleWritable和FloatWritable等也都实现了WritableComparable接口。所以我们最开始写wordcount等例子,我们使用Longritable,Text等类型做key值并没有去实现compareTo函数,最后结果也是排序好的,就是因为Hadoop提供的数据类型已经实现了WC接口,已经实现了compareTo函数了。如果你有特殊要求,Text,IntWritable这些类型不能满足你对key值的要求,需要自己新建一个数据对象作为自己的key值类型,那就像上图 图三那样重写一个类实现WritableComparable接口,同时实现compareTo函数,函数内部实现你自己的排序规则,最后reduce的数据就会按key值排序了。
所以总结上面,hadoop会调用key值类型的compareTo函数按照该函数的要求对key值进行排序。所以你想对哪些列排序就要把哪些列并入到key值对象中,像二次排序那样,要对两列进行排序,两列值都要并入key中,则key成为包含两个属性的复合key,Hadoop 提供的key值可用的类型不能满足要求,那就重写一个对象实现WritableComparable接口(类图三),该对象包含连个属性,并实现compareTo函数,最后会根据key值对两列数据排序,从而实现二次排序。本人也层试图用MR实现对value的排序,最终没能成功,也可能是本人水平有限,但至少会比对key排序复杂,这也是我要强调的不要试图单纯的对value进行排序,否则比较难实现排序。
- mapreduce对key值排序问题
- mapreduce实现对key的排序
- mapreduce实现对key的排序
- MapReduce Key排序原理
- MapReduce-自定义Key-二次排序
- mapreduce 利用InverseMapper.class对key,value进行 交换实现词频排序
- mapreduce 利用InverseMapper.class对key,value进行 交换实现词频排序 .
- map对key排序
- 吴超-----mapreduce的二次排序【在key排序的基础上,对value也进行排序】RawComparator
- HashMap:对key进行排序
- java对HashMap中的key或者value值进行排序!
- java对HashMap中的key或者value值进行排序!
- java如何对Map结构按照key值排序
- java对HashMap中的key或者value值进行排序
- HashMap根据key值对集合进行排序
- 字典排序问题——在value的基础上对key排序
- mapreduce的全排序问题
- mapreduce 二次排序后reduce输出中key的变化
- Java操作Excel文件以及在Android中的应用
- 修改phpmyadmin上传文件大小限制
- JavaFX-FXML
- vsftp进阶
- 关于stc51的冷启动下载和复位
- mapreduce对key值排序问题
- 三层架构
- 分层窗口实现千千静听的透明歌词
- 平台调用P-INVOKE高级篇(一)--(封送含有二维数组的结构体)
- 常用shell命令汇总
- Zynq加速设计日记-makefile分析
- [ios]makeKeyAndVisible
- Velocity基本语法
- tomcat shudown.sh 无法关闭