我有两个文件,格式如下:
field1, field2, field3 field4, field1, field5
不同的字段编号表示不同的含义.
我想使用基于相互字段的Hadoop Streaming加入这两个文件(field1
在上面的示例中),因此输出将是field1, field2, field3, field4, field5
(其他顺序可以正常,因为它们具有所有字段).
Hadoop有一个名为KeyFieldBasedPartitioner的库http://hadoop.apache.org/mapreduce/docs/r0.21.0/api/org/apache/hadoop/mapred/lib/KeyFieldBasedPartitioner.html
在您的作业启动中将此作为选项用作流式作业的分区程序,允许您将映射器输出分解为键/值对,并将键一起混合到同一个reducer和排序,包括值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中.
这实际上等同于将前两个字段指定为主键,将接下来的两个字段指定为辅助字段.主键用于分区,主键和辅助键的组合用于排序.
为了进行连接,只需输出映射器中的字段,并在配置启动时为作为键的字段设置选项,而reducer将按键适当地连接所有值.如果你想从多个源获取数据,只需在命令行上添加更多的输入...如果它们的输入长度不同,那么在mapper中你可以识别它并从mapper创建一个标准格式输出.