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

yur*_*ura 4 hadoop mapreduce self-join

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

Don*_*ner 7

要进行自我加入,您可以遵循"缩减侧连接"模式.映射器将连接/外键作为键发出,并将记录作为值发出.

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

don,baltimore,12
jerry,boston,19
bob,baltimore,99
cameron,baltimore,13
james,seattle,1
peter,seattle,2
Run Code Online (Sandbox Code Playgroud)

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

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

在reducer中,我们会得到这个:

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

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

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


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


在没有任何限制的情况下交叉产品是一场噩梦.也就是说,

select * from tablea, tableb;
Run Code Online (Sandbox Code Playgroud)

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

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


插件我的书:MapReduce设计模式.它应该在几个月后发布,但如果你真的感兴趣我可以给你发电子邮件关于连接的章节.