我发布了关于Hadoop的这个问题,但现在已经缩小了我的问题,所以我正在创建一个更具体的问题。
我创建了一个Hadoop Map / Reduce作业。它需要CSV并将其读入defaultdict,导入两个文件(正面和负面单词),然后对csv中的所有文本执行情绪分析。然后它输出这个结果(由reducer收集)并组合所有键。
我可以像这样在本地运行:
cat ~/Text/ListOfTexts.csv | python hadoop_map.py | sort | python hadoop_reduce.py
这样可以毫无问题地产生预期的结果。然后我尝试使用Hadoop Streaming运行它,如下所示:
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)。如果我运行只是映射器,我会得到两个输出文件,其中630个在一个,569个在另一个(因此加起来为1199)。
然而,当我使用与本地使用的代码相同的reducer时,我只计算630。此外,并非所有对都已合并。这让我觉得Hadoop没有正确地合并结果。有人知道为什么会这样吗?如果有必要,我可以发布我的代码,但我想在这里减少字数。
答案 0 :(得分:2)
我最终用廉价黑客来解决这个问题
映射器在reducer开始工作之前没有对结果进行排序。我有这样的方法:
if currentKey == key:
do something
问题在于,对于某些相同的密钥会执行此操作,而其他密钥直到稍后才被读入,因此它们的处理替换了之前在此语句中所做的操作。
为了解决这个问题,减速器的每一行输入都被读取到一个新的默认字典,以确保所有相同的键都在一起。
这就是我在本地机器上进行测试的原因。因为我这样做了:
cat name_of_file.csv | python hadoop_map.py | sort | python hadoop_reducer.py
Hadoop并没有在中间排序。
我仍然不确定为什么这不是由Hadoop自动完成的,正如我所说,我的解决方案是一个廉价的黑客。