在Hadoop中,键默认的排序处理方法是这样的:
其实,还可以实现更快的排序,可以只通过检视字节流而不用解析出包含在其中的数据来判断这两个key的顺序。 要支持这个高速的排序机制,可以在数据类型的比较器实现中继承WritableComparable类。
然后,重载如下方法:
复制代码代码示例:
public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2)
相应的方法:
复制代码代码示例:
public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2){
try{ buffer.reset(b1, s1, l1); key1.readFields(buffer); buffer.reset(b2, s2, l2); key2.readFields(buffer); }catch(IOException e){ throw new RuntimeException(e); } return compare(key1, key2); }
操作;
代码:
复制代码代码示例:
/** A WritableComparator optimized for Text keys. */
public static class Comparator extends WritableComparator { public Comparator() { super(Text.class); } public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) { int n1 = WritableUtils.decodeVIntSize(b1[s1]); int n2 = WritableUtils.decodeVIntSize(b2[s2]); return compareBytes(b1, s1+n1, l1-n1, b2, s2+n2, l2-n2); } }
代码说明:
方法decodeVIntSize确定了描述字节流长度的整形数的长度。比较器跳过这些字节,直接比对UTF编码的真实的字符串部分的字节,比较是通过compareBytes方法实现的。
注意,无需手动在Hadoop程序中指名这个比较器。
复制代码代码示例:
static {
// register this comparator WritableComparator.define(Text.class, new Comparator()); } |