4

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

4

2 回答 2

7

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

因此,假设我们想要对以下数据的“城市”(中间列)进行自连接:

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

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

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

在 reducer 中,我们将得到:

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

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

意识到 reduce-side 连接是昂贵的。如果您不过滤任何内容,它们会将几乎所有数据发送到减速器。此外,请注意将数据加载到减速器的内存中——通过将所有数据加载到数组列表中,您可能会在热连接键上炸毁堆。


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


在没有任何约束的情况下交叉乘积是一场噩梦。IE,

select * from tablea, tableb;

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

如果你能找出某种连接键,它是相似性的基本键,你会好很多。


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

于 2012-06-18T12:55:32.847 回答
0

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

于 2012-06-17T01:43:06.857 回答