Python MapReduce没有排序
我正在使用python开发mapreduce程序,当我使用comand line的map.py和reduce.py时:Python MapReduce没有排序,python,sorting,mapreduce,Python,Sorting,Mapreduce,我正在使用python开发mapreduce程序,当我使用comand line的map.py和reduce.py时: cat passengers.dat | python map.py | sort | python reduce.py cat passengers.dat | python map.py | sort 结果是好的。但如果我尝试使用mapreduce: hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming-2.2.0
cat passengers.dat | python map.py | sort | python reduce.py
cat passengers.dat | python map.py | sort
结果是好的。但如果我尝试使用mapreduce:
hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming-2.2.0.2.0.10.0-1.jar -input passengers.dat -output /out -file map.py -file reduce.py -mapper map.py -reducer reduce.py
结果是错误的,因为它似乎没有在减少之前进行排序
我得出这个结论是因为通过命令行:
cat passengers.dat | python map.py | sort | python reduce.py
cat passengers.dat | python map.py | sort
结果是:
141181 2014 5 1 0 STA 267
141181 2014 5 1 1 END 1031
141181 2014 5 1 4 STA 1031
141181 2014 5 1 5 END 267
但是,当我重写reduce以编写“reduce”接收行以了解问题所在时:
#!/usr/bin/env python
import sys
for line in sys.stdin:
print line
结果未排序:
141181 2014 5 1 1 END 1031
141181 2014 5 1 0 STA 267
141181 2014 5 1 5 END 267
141181 2014 5 1 4 STA 1031
第五列乱了!!!为什么
多谢各位
我在下面发布我的解决方案 我解决了这个问题,问题是mapreduce使用键值,并且有太多的键,所以我实现的解决方案是重写mapper以返回:
return 'value1#value2#value3#value4#value5#value6 \t value7'
通过这种方式,mapreduce对键进行了完美排序,我可以在reducer上进行拆分
我希望它会有用我不能复制您所做的一切,但我创建了一个python程序,它可以打印像您这样的每一行输入,然后将其传递给排序。我把你未分类的输入输入用管道输入,然后打印出所有已分类的内容。所以我不知道该告诉你什么。谢谢你,我已经解决了这个问题您应该这样做。谢谢,在我无法发布我的答案之前,现在是Yesell post,但让我在映射阶段为“\t”后找到了默认分隔符(请参阅)。您可以使用
-D stream.map.output.field.separator=。
(在本例中为句号,或者您希望的任何内容)对其进行更改。