0

Raw Comparator で以下を実装しようとしていますが、これを記述する方法がわかりませんか?

ここの tumestamp フィールドは、tyoe LongWritable のものです。

if (this.getNaturalKey().compareTo(o.getNaturalKey()) != 0) {
                return this.getNaturalKey().compareTo(o.getNaturalKey());
            } else if (this.timeStamp != o.timeStamp) {
                return timeStamp.compareTo(o.timeStamp);
            } else {
                return 0;
            }

ここでヒントを見つけましたが、LongWritabel 型を扱うこの実装方法がわかりません。 http://my.safaribooksonline.com/book/databases/hadoop/9780596521974/serialization/id3548156

ご協力いただきありがとうございます

4

4 に答える 4

1

(String stockSymbol, long timestamp) のペアを表す CompositeKey があるとします。stockSymbol フィールドで一次グループ化パスを実行して、1 つのタイプのすべてのデータをまとめて取得できます。次に、シャッフル フェーズ中の「二次ソート」で、タイムスタンプ long メンバーを使用して時系列ポイントをソートし、レデューサーに到達できるようにします。分割され、ソートされた順序で。

public class CompositeKey implements WritableComparable<CompositeKey> {
    // natural key is (stockSymbol)
    // composite key is a pair (stockSymbol, timestamp)
    private String stockSymbol;
    private long timestamp;
......//Getter setter omiited for clarity here
@Override
    public void readFields(DataInput in) throws IOException {
        this.stockSymbol = in.readUTF();
        this.timestamp = in.readLong();
    }

    @Override
    public void write(DataOutput out) throws IOException {
        out.writeUTF(this.stockSymbol);
        out.writeLong(this.timestamp);
    }

    @Override
    public int compareTo(CompositeKey other) {
        if (this.stockSymbol.compareTo(other.stockSymbol) != 0) {
            return this.stockSymbol.compareTo(other.stockSymbol);
        } 
        else if (this.timestamp != other.timestamp) {
            return timestamp < other.timestamp ? -1 : 1;
        } 
        else {
            return 0;
        }

    }

CompositeKey コンパレータは次のようになります。

public class CompositeKeyComparator extends WritableComparator {

    protected CompositeKeyComparator() {
        super(CompositeKey.class, true);
    }

    @Override
    public int compare(WritableComparable wc1, WritableComparable wc2) {
        CompositeKey ck1 = (CompositeKey) wc1;
        CompositeKey ck2 = (CompositeKey) wc2;

        int comparison = ck1.getStockSymbol().compareTo(ck2.getStockSymbol());
        if (comparison == 0) {
            // stock symbols are equal here
            if (ck1.getTimestamp() == ck2.getTimestamp()) {
                return 0;
            }
            else if (ck1.getTimestamp() < ck2.getTimestamp()) {
                return -1;
            }
            else {
                return 1;
            }
        }
        else {
            return comparison;
        }
    }
}
于 2015-09-11T07:36:17.667 に答える
0

hadoop が提供する LongWritable 型を比較す​​る方法について質問していますか? はいの場合、答えはcompare()メソッドを使用することです。詳細については、こちらを下にスクロールしてください

于 2012-10-11T05:31:49.760 に答える
0

LongWritableクラスで見たものからすでに実装されています:

/** A Comparator optimized for LongWritable. */ 
  public static class Comparator extends WritableComparator {
    public Comparator() {
      super(LongWritable.class);
    }

    public int compare(byte[] b1, int s1, int l1,
                       byte[] b2, int s2, int l2) {
      long thisValue = readLong(b1, s1);
      long thatValue = readLong(b2, s2);
      return (thisValue<thatValue ? -1 : (thisValue==thatValue ? 0 : 1));
    }
  }

そのバイト比較は、RawComparator.

于 2012-10-11T07:22:26.870 に答える
0

RawComparator を正しく実装する最善の方法は、WritableComparatorを拡張してメソッドをオーバーライドcompare()することです。WritableComparator は非常によく書かれているので、簡単に理解できます。

于 2012-10-11T07:08:38.450 に答える