我正在学习Python和Hadoop。我使用pythong + hadoop流完成了官方网站提供的设置和基本示例。我考虑过实现2个文件的连接。我完成了equi-join,检查两个输入文件中是否出现相同的密钥,然后按顺序输出密钥以及文件1和文件2中的值。等式连接按预期工作。
现在,我希望进行不等式连接,这涉及在应用不等式条件之前找到Cross Product。我正在使用相同的映射器(我需要更改它)并且我更改了reducer以使其包含嵌套循环(因为file1中的每个键值对都必须与file2中的所有键值对匹配)。这不起作用,因为您只能浏览一次流。现在,我想到了在reducer中存储'some'值并将它们进行比较的选项,但我不知道'怎么'很多。朴素的方法是将整个file2内容存储在一个数组(或类似的结构)中,但这是愚蠢的,违背了分布式处理的想法。最后,我的问题是
如何在reducer中存储值,以便我可以在两个文件之间交叉产品?
在equi-join中,Hadoop似乎将所有具有相同键的键值对发送到同一个reducer,这非常好,适用于该情况。但是,我如何改变这种行为(如果需要),以便所需的键值对分组成为正确的减速器?
示例文件: http://pastebin.com/ufYydiPu
Python Map / Reduce脚本: 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
非常感谢任何帮助/提示。
答案 0 :(得分:3)
处理可避免嵌套循环非常有用的多种组合的一种方法是使用itertools模块。特别是使用发电机处理笛卡尔积的itertools.product函数。这有利于内存使用和效率,如果您必须在一个map reduce工作中连接多个数据集,它可以显着简化代码。
关于映射器产生的数据与要在reducer中组合的数据集之间的对应关系,如果每个键的数据集不是太大,您可以简单地从映射器中得到如下组合:
{key, [origin_1, values]}
{key, [origin_2, values]}
因此,您将能够将reducer中具有相同原点的值分组为词典,这些词典将是使用itertools.product应用笛卡尔积的数据集。