我的問題是根據檔案中的頻率對單詞進行排序。
我的輸入是這種格式:
Word: Frequency:
coffee 6
good 9
I 50
morning 21
happy 9
預期的輸出應采用以下格式:
Frequency: Word:
50 I
21 morning
9 good
9 happy
6 coffee
我最初的計劃是將頻率設定為鍵,將單詞設定為值,但我不確定重復鍵 (9) 是否會導致值之間的沖突(好和快樂)。
public static class Map extends Mapper<Text, Text, Text, Text> {
private Text frequency = new Text();
private Text word = new Text();
public void map(Text value, Text key, Context context) throws IOException, InterruptedException {
word.set(value);
frequency.set(key);
context.write(key, value);
如果重復鍵沒有導致問題,那么通過上述代碼運行輸入是否正確?我知道 Hadoop 會自動對鍵進行排序,但不確定它是降序還是升序。我的目標是實作降序。
uj5u.com熱心網友回復:
重復鍵不會導致映射器出現問題。這些單詞將在 reducer 中簡單地組合在一起。
主要問題是不同鍵的減速器可以并行運行,因此您不能保證它們的輸出順序。
我的建議是使用 Spark、Pig 或 Hive 而不是 MapReduce 來簡單地對資料進行排序(或者hadoop fs -cat file.txt | sort -n在運行未排序的 WordCount 后使用 Unix 中的命令來處理較小的 HDFS 檔案)。
要解決reducer 問題,您需要將所有資料強制到一個reducer(使用NullWritable 作為映射器鍵,key,value輸出Text值)。然后在 reducer 中,使用 TreeMap 這樣的資料結構來插入和排序可迭代的值。然后遍歷該排序資料以將其鍵/值寫入背景關系
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/511165.html
標籤:爪哇Hadoop
上一篇:嘗試將資料保存到hdfs時出錯
下一篇:減少mapreduce輸出檔案
