我的映射器(Hadoop 1.2.1)創建了從簡單文本文件讀取的令牌的鍵值對。沒有火箭科學。 Reducer最終會「捆綁」(在Hadoop中,你是否像在SQL中一樣調用該分組?)相同的鍵,並且還將值1相加。這是默認的Hadoop教程。如何從30個最頻繁的單詞中「排序」?
但是,當這些值可用於我的reducer時,我想按降序對它們進行排序。只顯示前30個標記(字符串,單詞)。
看來有些概念對我來說並不清楚。
- 首先,對每個鍵值對調用
reduce
方法,對吧?因此,我沒有看到一個地方可以緩存像HashMap這樣的東西,它可以保存頂級結果(最常用的標記)。 我在想,如果我有這樣一個變量,我可以很容易地比較並插入每個有30個值的鍵。處理這個頻率排序任務的適當方法是什麼?
public static class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> { public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { int sum = 0; while (values.hasNext()) { sum += values.next().get(); } // CURRENTLY I SIMPLY OUTPUT THE KEY AND THE SUM. // IN THIS PLACE, HOW COULD YOU STORE E.G. A HASHMAP THAT // COULD STORE THE TOP 30? output.collect(key, new IntWritable(sum)); LOG.info("REDUCE: added to output:: key: " + key.toString()); }
}
這是一個堅實的開始! TreeMap很有意義!謝謝唐納德。絕對公平的指導書籍和文學(即使它是你的)。 與Hadoop 1.2.1中的'cleanup'方法等價的是什麼?MapReduceBase類從中擴展了mapper和reducer類,不是該方法的宿主。只有'configure'和'close'。 – feder
@feder啊!恥辱!我沒有意識到你正在使用舊的API。注意你的導入語句是'.mapred.'而不是'.mapreduce.' ...我不認爲它有類似的方法。也許你應該考慮轉換。對不起:\ –
我只是買了你的書後:)這確實暗示了一些黑點。 – feder