1

job.setGroupingComparatorClass作成したコンパレータ クラス ( ) を使用する Hadoop ジョブをPathDateComparator作成しました。ジョブを実行すると、コンストラクターPathDateComparatorが呼び出されていることがわかりますが、比較関数は呼び出されていません。

PathDateComparatorクラスは次のとおりです。

public class PathDateComparator extends WritableComparator {

    protected PathDateComparator() {
        super(Text.class, true);
        System.out.println("PathDateComparator");
    }

    private String getPath(String s) {
        System.out.println("s:" + s);
        String[] temp = s.split(IOUtil.tab);
        return temp[0];
    }

    @Override
    public int compare(Object o1, Object o2) {
        String k1 = ((Text) o1).toString();
        System.out.println("k1:" + k1);
        String path1 = getPath(k1);
        System.out.println("path1:" + path1);

        String k2 = ((Text) o2).toString();
        System.out.println("k2:" + k2);
        String path2 = getPath(k2);
        System.out.println("path2:" + path2);

        return path1.compareTo(path2);
    }

    @Override
    public int compare(WritableComparable o1, WritableComparable o2) {
        String k1 = ((Text) o1).toString();
        System.out.println("k1:" + k1);
        String path1 = getPath(k1);
        System.out.println("path1:" + path1);

        String k2 = ((Text) o2).toString();
        System.out.println("k2:" + k2);
        String path2 = getPath(k2);
        System.out.println("path2:" + path2);

        return path1.compareTo(path2);
    }

    @Override
    public int compare(byte[] bArray1, int offset1, int length1,
            byte[] bArray2, int offset2, int length2) {

        String k1 = new String(Arrays.copyOfRange(bArray1, offset1, offset1 + length1));
        System.out.println("k1:" + k1);
        String path1 = getPath(k1);
        System.out.println("path1:" + path1);

        String k2 = new String(Arrays.copyOfRange(bArray2, offset2, offset2 + length2));
        System.out.println("k2:" + k2);
        String path2 = getPath(k2);
        System.out.println("path2:" + path2);

        return path1.compareTo(path2);
    }
}
4

1 に答える 1

0

参照するクラス (ここでは PathDateComparator) は、RawComparator の実装者である必要があります。しかし、compare メソッドは正しいように見えます。このクラスは、バイト配列としてエンコードされたキー値を比較するためだけに使用されるという考え方です。

于 2013-08-14T02:45:21.023 に答える