2013-09-25 18 views

回答

2

如何獲得RawComparatorJobConf.getOutputKeyComparator

public RawComparator getOutputKeyComparator() { 
    Class<? extends RawComparator> theClass = getClass("mapred.output.key.comparator.class", 
      null, RawComparator.class); 
    if (theClass != null) 
     return ReflectionUtils.newInstance(theClass, this); 
    return WritableComparator.get(getMapOutputKeyClass().asSubclass(WritableComparable.class)); 
    } 

的Hadoop將嘗試從mapred.output.key.comparator.class獲得RawComparator類名。如果沒有設置,hadoop會嘗試將密鑰類別轉換爲WritableComparable,並使用它創建WritableComparator。所以如果我們不設置我們的客戶RawComparator,我們輸入WritableComparator.get

public static synchronized 
    WritableComparator get(Class<? extends WritableComparable> c) { 
    WritableComparator comparator = comparators.get(c); 
    if (comparator == null) { 
     // force the static initializers to run 
     forceInit(c); 
     // look to see if it is defined now 
     comparator = comparators.get(c); 
     // if not, use the generic one 
     if (comparator == null) { 
     comparator = new WritableComparator(c, true); 
     } 
    } 
    return comparator; 
    } 

WritableComparator.get,它將會在地圖comparators搜索WritableComparator在第一。

大部分建於Writable S,如IntWritable,在加載時,他們將調用define把他們WritableComparator(例如,org.apache.hadoop.io.IntWritable.Comparator)至comparators。所以,如果你想註冊您的自定義RawComparator,您可以像使用的代碼(你需要確保這些代碼在你Writable類主體):

static {          // register this comparator 
    WritableComparator.define(IntWritable.class, new Comparator()); 
    } 

接下來,如果WritableComparable不註冊WritableComparator會發生什麼?這是WritableComparator的默認行爲。它會調用WritableComparable.compareTo來比較兩個密鑰。

相關問題