首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在hadoop中实现自连接/跨产品?

问如何在hadoop中实现自连接/跨产品?
EN

Stack Overflow用户
提问于 2012-06-17 03:33:16
回答 2查看 4.2K关注 0票数 4

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-18 20:55:33

要执行自连接,可以遵循"reduce-side join“模式。映射器发出连接/外键作为键,记录作为值。

因此,假设我们想对以下数据进行"city“(中间一列)的自连接:

代码语言:javascript
复制
don,baltimore,12
jerry,boston,19
bob,baltimore,99
cameron,baltimore,13
james,seattle,1
peter,seattle,2

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

代码语言:javascript
复制
(baltimore -> don,12)
(boston -> jerry,19)
(baltimore -> bob,99)
(baltimore -> cameron,13)
(seattle -> james,1)
(seattle -> peter,2)

在reducer中,我们将得到以下结果:

代码语言:javascript
复制
(baltimore -> [(don,12), (bob,99), (cameron,13)])
(boston -> [(jerry,19)])
(seattle -> [(james,1), (peter,2)])

在这里,您可以执行内部连接逻辑,如果您愿意的话。要做到这一点,您只需将每个项目与其他项目进行匹配。为此,将数据加载到数组列表中,然后对这些项执行N x N循环,以便彼此进行比较。

要意识到减少端连接的代价是很高的。如果你不过滤任何东西,它们会将几乎所有的数据发送给reducers。此外,在将数据加载到reducers中的内存时要小心--通过加载数组列表中的所有数据,您可能会在热连接键上耗尽堆。

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

在没有任何约束的情况下,叉积是一场噩梦。也就是说,

代码语言:javascript
复制
select * from tablea, tableb;

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

如果你能找出某种连接键,这是相似性的一个基本键,你就会变得更好。

为我的书做插头:MapReduce Design Patterns。它应该会在几个月内出版,但如果你真的感兴趣,我可以通过电子邮件发送给你关于joins的章节。

票数 7
EN

Stack Overflow用户

发布于 2012-06-17 09:43:07

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11066434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档