我正在学习 Python 和 Hadoop。我使用 pythong+hadoop streaming 完成了官方网站提供的设置和基本示例。我考虑过实现 2 个文件的连接。我完成了 equi-join 检查两个输入文件中是否出现相同的键,然后它按顺序输出键以及文件 1 和文件 2 中的值。相等连接按预期工作。

现在,我希望进行不等式连接,这涉及在应用不等式条件之前找到叉积。我正在使用相同的映射器(我需要更改它吗)并且我更改了缩减器以便它包含一个嵌套循环(因为 file1 中的每个键值对都必须与 file2 中的所有键值对匹配)。这是行不通的,因为您只能通过一次流。现在,我想到了在 reducer 中存储“一些”值并比较它们的选项,但我不知道“有多少”。天真的方法是将整个 file2 内容存储在数组(或类似结构)中,但那是愚蠢的,并且违背了分布式处理的想法。最后,我的问题是

  1. 如何在 reducer 中存储值,以便我可以在两个文件之间进行叉积?

  2. 在 equi-join 中,Hadoop 似乎将所有具有相同键的键值对发送到相同的 reducer,这非常好并且适用于这种情况。但是,我如何更改此行为(如果需要)以便所需的键值对分组进入正确的 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 

非常感谢任何帮助/提示。

请您参考如下方法:

处理多种组合的一种方法非常有助于避免嵌套循环,即使用 itertools 模块。特别是 itertools.product使用生成器处理笛卡尔积的函数。这有利于内存使用和效率,如果您必须在一个 map reduce 作业中加入多个数据集,它可以显着简化您的代码。

关于mapper产生的数据和reducer中要组合的数据集的对应关系,如果每个key的数据集不是太大,可以简单的从mapper中yield这样的组合:

{key, [origin_1, values]} 
{key, [origin_2, values]} 

因此,您将能够将 reducer 中具有相同来源的值分组到字典中,这些字典将是使用 itertools.product 应用笛卡尔积的数据集。


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!