我正在学习python和hadoop。我使用pythong+hadoop流媒体完成了官方网站提供的设置和基本示例。我考虑过实现两个文件的连接。我完成了equi join,它检查两个输入文件中是否出现相同的键,然后它按顺序输出键以及来自文件1和文件2的值。相等联接按预期工作。
现在,我想做一个不等式连接,包括在应用不等式条件之前求交叉积。我使用的是同一个Map器(我是否需要更改它),并且我更改了reducer,使其包含嵌套循环(因为file1中的每个键值对都必须与file2中的所有键值对匹配)。这不起作用,因为你只能通过一次流。现在,我想到了一个在reducer中存储“some”值并比较它们的选项,但我不知道“多少”。天真的方法是将整个file2内容存储在一个数组(或类似的结构)中,但这很愚蠢,不符合分布式处理的思想。最后,我的问题是
如何在reducer中存储值,以便在两个文件之间具有交叉积?
在equi-join中,hadoop似乎将所有具有相同键的键值对发送到同一个reducer,这非常好,并且在这种情况下工作得很好。但是,我如何改变这种行为(如果需要的话),使所需的键值对分组正确?
示例文件:http://pastebin.com/ufyydipu
pythonMap/减少脚本:http://pastebin.com/kejwd2u1
我使用的hadoop命令:
bin/hadoop jar contrib/streaming/hadoop-*streaming*.jar -file /home/hduser/mapper.py -mapper mapper.py -file /home/hduser/ireducer.py -reducer reducer.py -input /user/hduser/inputfiles/* -output /user/hduser/join-output
任何帮助/暗示都将不胜感激。
1条答案
按热度按时间nnvyjq4y1#
处理多个组合的一种方法是使用itertools模块,这对避免嵌套循环非常有帮助。特别是itertools.product函数,它使用生成器处理笛卡尔积。这有助于提高内存使用率和效率,而且如果必须在一个map reduce作业中连接多个数据集,它可以显著简化代码。
关于Map器生成的数据与要在reducer中组合的数据集之间的对应关系,如果每个键的数据集不是太大,您可以简单地从Map器生成如下组合:
因此,您将能够将reducer中具有相同原点的值分组到字典中,这些字典将是使用itertools.product应用笛卡尔积的数据集。