2013-08-01 29 views
0

如何根據鍵名設置輸出文件?如何根據鍵名設置輸出文件?

例如,在mapreduce中採用流行的WordCount示例。如果我用正確的語法給它一個任意的文件,它應該找到關鍵字(單詞)和它們出現的頻率。如何獲得輸出,其中每個鍵都是文件名,文件內部是值?

(我問,因爲我目前的理解是,MultipleOutputs還需要指定特定文件名使用)

使用Hadoop 0.20.205.0

(也可以有人點我一些好的教程這個hadoop版本?)

+0

請每個帖子提問一個問題。 – chrylis

回答

0

With this function in MultipleOutputs您不需要在初始化作業時在任何位置預先指定文件名。

使用該從減速 -

void write(K key, V value, String baseOutputPath); 

baseOutputPath可以成爲你的關鍵的字符串表示。

例如void write(K key, V value, getFileName(key))

getFileName(K key){ 
    return (key.toString()); 
} 

請看看鏈接中的例子,你會明白的。

此外,您不需要從減速器用戶context.write()。而是僅使用 MultipleOuputs'write()函數。

這使得一切都變得動態,在我看來,如果這就是你想要的。

NOTE(註釋後):

因爲,你說你不能使用MultipleOutputs的是另一種方式,你其實可以到 這一點。

  1. 由於減少函數只處理一個關鍵,而不是做一個context.write(鍵,值),可以使用Hadoop的FileSystem api建立在HDFS文件(與您的鍵名)。

喜歡的東西:

FileSystem fs = file.getFileSystem(context.getConfiguration()); 
FSDataOutputStream fileOut = fs.create(key.toString()); 
  1. create()函數將返回你FSDataOutputStream對象。使用write()函數寫入文件。

  2. 完成後關閉FileSystem對象。 類似 - fs.close();

+0

不要以爲我可以在0.20.205.0中使用 – Julian

+0

@Julian:爲什麼要注意? –

+0

@ Julian:我已經更新了我的答案,如果您不打算自己創建MultipleOutputs,那麼應該支持Hadoop 0.20.205。 –

0

如果你想要根據不同的密鑰寫入多個文件的值,只需使用密鑰(String s,我會推測)來構造文件名並以通常的方式創建文件例如,與FileWriter

+0

啊所以hadoop的輸出並不一定是我想要的結果文件?我可以用寫作者寫下來嗎?真棒。那麼hadoop的輸出是什麼? – Julian

+0

也無論如何獲得減速機的路徑呢? – Julian

相關問題