1

我需要改进我的 MR 工作,我想到的一件事是实现一个定制的 rawComparator,但是我的关键类除了一些 int 字段之外还有很多字段作为字符串,我不确定如何从字节中解析出字符串字段 [] ,

我的重点课

public GeneralKey {
  private int day;
  private int hour;
  private String type;
  private String name;
  ..
}

我定制的 rawComparator:

public class GeneralKeyComparator extends WritableComparator {
    private static final Text.Comparator TEXT_COMPARATOR = new Text.Comparator();

    protected GeneralKeyComparator() {
        super(GeneralKey.class);
    }

    @Override
    public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
        int day1 = readInt(b1, s1);
        int day2 = readInt(b2, s2);

        int comp = (intDay1 < intDay2) ? -1 : (intDay1 == intDay2) ? 0 : 1;
        if (0 != comp) {
            return comp;
        }

        int hr1 = readInt(b1, s1+4);
        int hr2 = readInt(b2, s2+4);
        comp = (hr1 < hr2) ? -1 : (hr1 == hr2) ? 0 : 1;

            .... how to compare the String fields here???   

        return comp;
    }

谷歌周围我发现人们试过这个:

try {
    int firstL1 = WritableUtils.decodeVIntSize(b1[s1]) + readInt(b1, s1+8);
    int firstL2 = WritableUtils.decodeVIntSize(b2[s2]) + readVInt(b2, s2+8);
    comp = TEXT_COMPARATOR.compare(b1, s1, firstL1, b2, s2, firstL2);

} catch (IOException e) {
    throw new IllegalArgumentException(e);
}

但我不明白这是如何工作的,也不认为它在我的情况下有效,有人可以帮忙吗?谢谢

在此处添加了 readField() 和 write() 方法:

public void readFields(DataInput input) throws IOException {
    intDay = input.readInt();
    hr = input.readInt();
    type = input.readUTF();
    name = input.readUTF();
    ...
    }

@Override
public void write(DataOutput output) throws IOException {
    output.writeInt(intDay);
    output.writeInt(hr);
    output.writeUTF(type);
    output.writeUTF(name);
            ...
    }
4

1 回答 1

1

你说的对。您找到的示例不适用于您。该示例的键中的数据字段是 WritableComparables。你有基本类型(int,String)。

当您使用基本类型时,我假设您已经为您的自定义 Key 类型实现了序列化/反序列化方法。

对于 Java 字符串的第三个和第四个数据字段,您应该能够在 String 类上使用 compareTo 方法。

其他选择是使用 WritableComparables 而不是使用基本类型,并使用您在 google 示例中找到的相同技术。

于 2013-08-29T03:50:50.110 回答