2013-05-05 42 views
0

我在完成我認爲是一項簡單的任務時遇到了一些麻煩。我試圖迭代每行兩個整數的文件。目標是獲取第一個整數並將其用作鍵值,並將第二個整數的值作爲列表存儲,但前提是該值不在列表中。因此,如果該文件是這樣的:使用Hadoop將列表作爲值處理的最佳方式是什麼?

3 11  
4 7 
5 10 
5 6 
6 5 
6 10 
3 11 #should be ignored 

那麼理想,我有這樣的事情在最後:

3 [11] 
4 [7] 
5 [10, 6] 
6 [5, 10] 

什麼是有關的方面要對此最好的辦法用於存儲值的數據結構?我知道我可以使用ArrayWritable,但我不認爲你可以動態地爲它添加值。我不在乎鑰匙的順序。

+0

你想文本輸出,或東西,你要開始的過程 - 即你想要一個序列文件(如果文本然後@greedybuddha目前的答案是可以接受的) – 2013-05-06 01:52:23

+0

我做了一些進展開始策劃,但目前,文本表示沒問題。 – 2013-05-06 17:09:01

回答

1

所以你的問題是非常類似於經典WordCount的例子。在你的情況下,雖然你不想發出總和,但只是一次性的價值。至於數據結構本身,它已經存在於數據結構中,即Iterable中,因此不需要將它們添加到新的數據結構中。你真正想做的只是以你需要的任何形式打印出來。下面我將解釋我認爲你需要整個項目的內容。

對於映射器,您想要標識映射器,您希望輸出鍵值對,確切如何讀取它。可以使用Identity Mapper完成,或者如果您使用新的API,則不需要指定一個,0.23+。

對於Reducer,你應該做類似於下面的事情。這只是簡單地將給定鍵的值附加了您想要的逗號,正如我之前提到的,您不需要將它們放入新的數據結構中,因爲它們已經在一箇中。一旦減速器完成附加一個鍵的值,那麼它只是發出帶有逗號分隔值的鍵。

@Override 
public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { 
    StringBuilder sb = new StringBuilder(); 
    boolean first = true; 
    for (Text value: values){ 
     if (!first) sb.append(", "); 
     else first = false; 
     sb.append(value); 
    } 
    context.write(key, new Text(sb.toString())); 
} 
相關問題