如何在MapReduce Python流中对多个字段进行排序?

时间:2019-02-15 05:49:13

标签: python mapreduce

在将MapReduce与流媒体和Python结合使用时,我在排序时遇到问题。

这是一个更大的问题的一部分,但可以将其简化为(无双关语:)):

>> cat inputFile.txt
a       b       1       file1
a       b       2       file1
e       f       0       file2
d       c       3       file3
d       e       2       file4
a       c       5       file5
a       b       3       file1
d       c       2       file3
e       f       2       file2
a       c       4       file5
d       e       10      file4

第一和第二列是键。

我希望对地图阶段的输出进行这种排序(首先按column1,然后按数字2,然后按数字3):

>>sort -k1,1 -k2,2 -k3n,3 inputFile.txt
a       b       1       file1
a       b       2       file1
a       b       3       file1
a       c       4       file5
a       c       5       file5
d       c       2       file3
d       c       3       file3
d       e       2       file4
d       e       10      file4
e       f       0       file2
e       f       2       file2

这里的第四列暗示了我如何将文件还原,但是如果两个键在同一个文件中(只要每个键的所有实例都在一个文件中)就可以了)。 为此,我运行以下命令:

hadoop jar /usr/lib/hadoop/hadoop-streaming.jar -D stream.num.map.output.key.fields=2 -D mapred.text.key.comparator.options="-k3,3" -D mapred.text.key.partitioner.options="-k3,3" -mapper cat -reducer cat -input /user/hadoop/inputFile.txt -output /user/hadoop/output

此命令的输出未排序。例如:

>>cat output/part-00066
a       b       2       file1
a       b       3       file1
a       b       1       file1

备注:

  • 我知道在上面的命令中,我使用了“ -k3,3”而不是“ -k3n,3”,但是 我只是想看看一开始是否有任何效果
  • 我尝试使用“ -k1,1,-k2,2 -k3n,3”,但是得到了相同的结果
  • 我尝试使用3作为字段数,结果是密钥在单独的文件中

这似乎是我真正想念的东西,我在做什么错了?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

尝试了几乎所有可能的组合之后,我发现这可行:

    hadoop jar /usr/lib/hadoop/hadoop-streaming.jar \
    -D \ 
 mapred.output.key.comparator.class=org.apache.hadoop.mapred.lib.KeyFieldBasedComparator\ 
-D stream.num.map.output.key.fields=4 \
    -D mapred.text.key.partitioner.options=-k1,2 \
    -D mapred.text.key.comparator.options=-"-k1,1 -k2,2 -k3n,3" \
    -input /user/hadoop/inputFile.txt \
    -output /user/hadoop/output \
    -mapper cat -reducer cat \
    -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner

可以找到更多的解释here

关键(同样,没有双关语:))是使用KeyFieldBasedPartitioner作为分区程序。