use*_*751 11 python hadoop mapreduce
我正在学习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
Run Code Online (Sandbox Code Playgroud)
非常感谢任何帮助/提示.
处理多种组合的一种方法是使用 itertools 模块,这对于避免嵌套循环非常有帮助。具体来说, itertools.product函数使用生成器处理笛卡尔积。这有利于内存使用和效率,并且如果您必须在一个 MapReduce 作业中加入多个数据集,它可以显着简化您的代码。
关于mapper产生的数据和reducer中要组合的数据集之间的对应关系,如果每个key的数据集不太大,你可以简单地从mapper产生一个组合,如下所示:
{key, [origin_1, values]}
{key, [origin_2, values]}
Run Code Online (Sandbox Code Playgroud)
因此,您将能够将减速器中具有相同来源的值分组到字典中,这些字典将成为使用 itertools.product 应用笛卡尔积的数据集。
| 归档时间: |
|
| 查看次数: |
1609 次 |
| 最近记录: |