當我試圖用組合在我的MR工作我得到以下例外如何使用組合器,當減速器的輸出值爲空時?
顯示java.lang.NullPointerException
在 org.apache.hadoop.mapred.IFile $ Writer.append(IFile.java :193)
在 org.apache.hadoop.mapred.Task $ CombineOutputCollector.collect(Task.java:1315)在 org.apache.hadoop.mapred.Task $ NewCombinerRunner $ OutputConverter.write(任務.java:1632)
原因是,我正在使用null作爲我在Reducer類中的輸出VALUE。 減速器代號:
public static class reducer extends Reducer<Text,IntWritable,Text,IntWritable>{
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException{
context.write(key, null);
}
}
當我刪除組合器類job.setCombinerClass(reducer.class);工作正在取得成功。
如何實現組合器,我需要相同的減速器輸出,即只有KEY作爲輸出?
爲什麼不使用可選的Java或空對象?或者在減速器代碼中檢查空值。 – SMA
我不確定你爲什麼是'null',你是否考慮使用'NullWritable'。 – YoungHobbit
@YoungHobbit,我試過NullWritable,但是我面對同樣的錯誤。只是爲了測試我嘗試**新的IntWritable()**,那麼沒有問題。但是輸出結果並不如預期,最後加上0。 – Abhinay