gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 06:28:00 25 4
gpt4 key购买 nike

我在将 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

第一列和第二列是键。

我希望 map 阶段的输出以这种方式排序(首先按 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

这里的第四列是关于我希望文件如何用于 reduce 步骤的提示,但是如果两个键在同一个文件中也没关系(只要每个键的所有实例都在一个文件中) ).为此,我运行以下命令:

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 作为字段数,结果结果是键位于单独的文件中

这就像我缺少的一些非常基本的东西,我在这里做错了什么?

非常感谢您的帮助!

最佳答案

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

    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 作为分区器。

关于python - 如何在 MapReduce Python Streaming 中对多个字段进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54703336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com