2010-11-13 65 views
11

我有兩個文件,在下面的格式:你會如何建議使用Hadoop流媒體進行「加入」?

field1, field2, field3 
field4, field1, field5 

一個不同領域的數字表示不同的含義。

我想加入使用Hadoop流基礎上的相互場(field1在上面的例子)兩個文件,以便輸出將是field1, field2, field3, field4, field5(其它排序都ok沿,因爲他們擁有所有的字段)。

回答

6

的Hadoop有一個名爲KeyFieldBasedPartitioner庫http://hadoop.apache.org/mapreduce/docs/r0.21.0/api/org/apache/hadoop/mapred/lib/KeyFieldBasedPartitioner.html

使用本作中,你的工作推出的分區爲您的數據流作業的選項,您可以將映射器輸出打入鍵/值對,並有鑰匙得到散列起來一起去同減速器和排序包括值http://hadoop.apache.org/mapreduce/docs/r0.21.0/streaming.html#More+Usage+Examples

$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar \ 
-D stream.map.output.field.separator=. \ 
-D stream.num.map.output.key.fields=4 \ 
-D mapreduce.map.output.key.field.separator=. \ 
-D mapreduce.partition.keypartitioner.options=-k1,2 \ 
-D mapreduce.job.reduces=12 \ 
-input myInputDirs \ 
-output myOutputDir \ 
-mapper org.apache.hadoop.mapred.lib.IdentityMapper \ 
-reducer org.apache.hadoop.mapred.lib.IdentityReducer \ 
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner 

這裏,-D stream.map.output.field.separator =。和-D stream.num.map.output.key.fields = 4在這裏解釋http://hadoop.apache.org/mapreduce/docs/r0.21.0/streaming.html#Customizing+How+Lines+are+Split+into+Key%2FValue+Pairs基本上他們是你如何輸出你的映射器字段來定義鍵/值對。

上述MapReduce作業的地圖輸出鍵通常有四個以「。」分隔的字段。但是,MapReduce框架將使用-D mapreduce.partition.keypartitioner.options = -k1,2選項將鍵輸出的前兩個字段分區。這裏,-D mapreduce.map.output.key.field.separator =。指定分區的分隔符。這保證了鍵中所有具有相同前兩個字段的鍵/值對將被分區到相同的縮減器中。

這實際上等同於將前兩個字段指定爲主鍵,將後兩個字段指定爲次要字段。主鍵用於分區,主鍵和輔助鍵的組合用於排序。

爲了做一個連接,它就像輸出你的映射器中的字段一樣簡單,並且在配置啓動時爲作爲鍵的字段設置選項,並且reducer將通過鍵正確地連接所有的值。如果你想從多個來源獲取數據,只需要在命令行上添加更多的輸入......如果它們的輸入長度不同,那麼在你的映射器中,你可以識別並從映射器創建標準格式輸出。

相關問題