2012-10-11 66 views
0

我想在原始比較器中實現以下內容,但不知道如何編寫此代碼?Hadoop原始比較器

這裏的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

感謝您的幫助

+1

不知道你在問什麼。自然鍵是一個長時間存儲的時間戳嗎? –

+0

否自然鍵是一個id和文本類型 – javanx

回答

0

你是詢問的方式來比較的Hadoop提供LongWritable類型? 如果是,那麼答案是使用compare()的方法。欲瞭解更多詳情,請向下滾動here

0

正確實施RawComparator的最佳方法是擴展WritableComparator並覆蓋compare()方法。 WritableComparator寫得很好,所以你可以很容易地理解它。

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的覆蓋。

1

假設我有一個CompositeKey表示一對(String stockSymbol,long timestamp)。 我們可以在stockSymbol字段上做一個主要的分組傳遞,將一種類型的所有數據放在一起,然後我們在隨機播放階段的「二次排序」使用時間戳長成員對時間序列點進行排序,以便它們到達減速器分區並按排序順序。

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; 
     } 
    } 
}