如何使用hadoop实现自联接/跨产品?

时间:2012-06-16 19:33:16

标签: hadoop mapreduce self-join

对项目对进行一些评估是一项常见任务: 示例:重复数据删除,协同过滤,类似项目等 这基本上是具有相同数据源的自连接或交叉产品。

2 个答案:

答案 0 :(得分:7)

要进行自我加入,您可以按照“缩小边加入”模式进行操作。映射器将连接/外键作为键发出,记录作为值发送。

所以,假设我们想在以下数据上对“城市”(中间栏)进行自我加入:

don,baltimore,12
jerry,boston,19
bob,baltimore,99
cameron,baltimore,13
james,seattle,1
peter,seattle,2

映射器将发出key->值对:

(baltimore -> don,12)
(boston -> jerry,19)
(baltimore -> bob,99)
(baltimore -> cameron,13)
(seattle -> james,1)
(seattle -> peter,2)

在减速机中,我们会得到这个:

(baltimore -> [(don,12), (bob,99), (cameron,13)])
(boston -> [(jerry,19)])
(seattle -> [(james,1), (peter,2)])

从这里开始,如果您愿意,可以执行内连接逻辑。要做到这一点,您只需匹配每个项目的每个项目。为此,将数据加载到数组列表中,然后在项目上进行N×N循环,以便相互比较。

意识到减少边连接很昂贵。如果你没有过滤掉任何东西,它们会将所有数据发送给reducer。另外,请注意将数据加载到reducers中的内存中 - 您可以通过加载数组列表中的所有数据来将堆烧在热连接键上。


以上与典型的缩减侧连接略有不同。连接两个数据集时的想法是一样的:外键是键,记录是值。唯一的区别是值可能来自两个或更多数据集。您可以使用MultipleInputs让不同的映射器解析不同的输入集,然后让reducer从两者中收集数据。


在没有任何限制的情况下交叉产品是一场噩梦。即,

select * from tablea, tableb;

有很多方法可以做到这一点。它们都不是特别有效。如果你想要这种行为,请给我留言,我会花更多的时间来解释一种方法。

如果你能找到某种连接键,这是相似性的基本关键,那么你就会好多了。


插入我的书:MapReduce Design Patterns。它应该在几个月内发布,但如果你真的感兴趣,我可以给你发电子邮件给你关于连接的章节。

答案 1 :(得分:0)

通常使用reducer来执行连接所需的任何逻辑。诀窍是将数据集映射两次,可能会在指示运行它的值上添加一些标记。然后,自我联接与任何其他类型的联接没有什么不同。