我有兩個文件,在下面的格式:你會如何建議使用Hadoop流媒體進行「加入」?
field1, field2, field3
field4, field1, field5
一個不同領域的數字表示不同的含義。
我想加入使用Hadoop流基礎上的相互場(field1
在上面的例子)兩個文件,以便輸出將是field1, field2, field3, field4, field5
(其它排序都ok沿,因爲他們擁有所有的字段)。
我有兩個文件,在下面的格式:你會如何建議使用Hadoop流媒體進行「加入」?
field1, field2, field3
field4, field1, field5
一個不同領域的數字表示不同的含義。
我想加入使用Hadoop流基礎上的相互場(field1
在上面的例子)兩個文件,以便輸出將是field1, field2, field3, field4, field5
(其它排序都ok沿,因爲他們擁有所有的字段)。
的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將通過鍵正確地連接所有的值。如果你想從多個來源獲取數據,只需要在命令行上添加更多的輸入......如果它們的輸入長度不同,那麼在你的映射器中,你可以識別並從映射器創建標準格式輸出。
Cascading爲過濾,加入和字段分組提供了有用的抽象。 https://stackoverflow.com/questions/4626356指向如何在Cascading中使用Hadoop流的有用示例。