排序是数据分析中最常用的操作,没有之一。
单字段升序:
利用 mapreduce 自身的排序机制,把需要排序的字段作为 key 即可
其它排序:
自定义排序规则
方案一:自定义 key
1. 自定义类实现 WritableComparable 接口,设置泛型为自定义类
2. 声明需要排序的字段,添加 setter && getter
3. 实现接口的 3 个方法
write:序列化属性值为二进制
readFields:从二进制反序列化属性值
compareTo:自定义大小比较规则
4. 使用自定义 key 作为 map 输出的 key 类型
方案二:自定义排序规则
1. 自定义类继承 WritableComparator
2. 重写父类无参构造方法,指定 key 的类型
super(Text.class, true);
3. 重写父类 compare(WritableComparable a, WritableComparable b) 方法,实现自定义比较规则
4. 设置 job 使用自定义排序规则
job.setSortComparatorClass()
二次排序(多字段排序):
先按照 ip 排序,ip 相同按照 count 排序
1. 把所有需要排序的字段放入 key 中
2. 自定义排序规则
3. 在 compare 中设置比较的顺序
action 升序,count 降序
自定义聚合规则:
默认是 key 相同的 value 自动聚合
1. 自定义类继承 WritableComparator
2. 重写父类无参构造方法,指定 key 的类型
super(Text.class, true);
3. 重写父类 compare(WritableComparable a, WritableComparable b) 方法,实现自定义聚合规则
返回 0 聚合,否则不聚合
4. 设置 job 使用自定义聚合规则
job.setGroupingComparatorClass()
Java 中的排序:
Java 中的所有排序都依赖 Comparable 进行大小比较的,并且都是升序排列
不能控制排序的方式,但是可以控制大小比较的结果
通过控制大小比较结果来影响排序结果
实现 Comparable 接口需要实现 compareTo 方法
返回值只看类型,不看数值
负数 this < o
0 this = o
正数 this > o
自定义排序,就是自定比较大小的规则,实现 compareTo 方法
正常的大小比较 == 升序
取反 == 降序
7701




被折叠的 条评论
为什么被折叠?



