链接:https://stackoverflow.com/questions/18583242/funny-results-with-hadoop-will-having-a-single-input-file-cause-this
我发布了这个关于hadoop的问题,但是现在已经缩小了我的问题范围,所以我要创建一个更具体的问题。
我已经创建了一个hadoop map/reduce作业。它获取一个csv并将其读入defaultdict,导入两个文件(肯定词和否定词),然后对csv中的所有文本执行情感分析。然后输出这个结果(由reducer收集)并合并所有键。
我可以这样在本地运行它:
cat ~/Text/ListOfTexts.csv | python hadoop_map.py | sort | python hadoop_reduce.py
这就产生了预期的结果,没有任何问题。然后我尝试使用hadoop流媒体运行它,如下所示:
bin/hadoop jar contrib/streaming/hadoop-streaming-1.1.2.jar
-file positive_words.txt -file negative_words.txt
-file hadoop_map.py -mapper hadoop_map.py
-file hadoop_reduce.py -reducer hadoop_reduce.py
-input /ListOfTexts.csv -output /OutputOfTexts.txt
这会处理所有的信息,但由于某些原因不能正确地组合结果。我实现了一个“count”变量来查看它扫描了多少文档(应该有1199个)。如果我只运行mapper,就会得到两个输出文件,一个是630,另一个是569(这样加起来就是1199)。
但是,当我使用与本地使用的代码相同的reducer时,我只计算了630。此外,并非所有对都已合并。这让我觉得hadoop没有正确地组合结果。有人知道为什么会这样吗?如果有必要,我可以发布我的代码,但我正在努力减少这里的字数。
1条答案
按热度按时间hfyxw5xn1#
最后我用廉价的黑客把它修好了
在还原程序开始工作之前,Map程序没有对结果进行排序。我有这样的方法:
问题是,这将对一些相同的键执行,而其他键直到稍后才被读入,因此它们的处理替换了之前在此语句中所做的处理。
为了解决这个问题,reducer的每一行输入都被读入一个新的默认dict,以确保所有相同的键都在一起。
这就是我在本地机器上进行测试的原因。因为我这么做了:
Hadoop没有在中间做排序。
我仍然不确定为什么这不是hadoop自动完成的,正如我所说的,我的解决方案是一个廉价的黑客。