在Hadoop中实现数据排序的主要方式是:
- 使用Comparator比较器自定义排序:
- 实现
WritableComparable
或RawComparator
接口。 - 重写
compare()
方法定义排序规则。 - 在作业中设置自定义比较器。
- 实现
- Hadoop自带多种比较器实现常见排序:
- 自然排序:WritableComparator.NATURAL_COMPARATOR
- 字典排序:WritableComparator.BYTEWISE_COMPARATOR
- 数字排序:NumericComparator
- 在MapReduce中设置排序:
- Mapper输出不排序。
- 在Reducer中对Mapper输出进行排序:
job.setSortComparatorClass(CustomComparator.class);
- 也可以在读取数据时预排序:
- 设置TotalOrderPartitioner进行分片。
- 在Reduce中无需再排序。
- 示例 – 自定义字符串反向排序:
- 实现RawComparator:
public class ReverseComparator extends WritableComparator {
public ReverseComparator() {
super(Text.class, true);
}
@Override
public int compare(WritableComparable a, WritableComparable b) {
Text first = (Text)a;
Text second = (Text)b;
return -first.toString().compareTo(second.toString());
}
}
- 在作业中设置:
job.setSortComparatorClass(ReverseComparator.class);
数据排序的主要作用是:
- 实现Reduce端的数据聚合。
- 生成有序数据输出。
- 预排序提高排序效率。
来看一些简单示例:
- 自定义字符串反向排序比较器:
public class ReverseComparator extends WritableComparator {
public ReverseComparator() {
super(Text.class, true);
}
@Override
public int compare(WritableComparable a, WritableComparable b) {
Text first = (Text)a;
Text second = (Text)b;
return -first.toString().compareTo(second.toString());
}
}
- 在MapReduce作业中设置ReverseComparator:
job.setSortComparatorClass(ReverseComparator.class);
- also可以在MapReduce中设置TotalOrderPartitioner实现分片预排序:
job.setPartitionerClass(TotalOrderPartitioner.class);
所以通过比较器和预排序,我们可以高效实现Hadoop MapReduce作业中数据的排序。