如何使用Hadoop实现自加入/跨产品



项目对进行一些评估是常见的任务:示例:重复数据消除、协同筛选、类似项目等这基本上是具有相同数据源的自联接或跨产品。

要执行自连接,您可以遵循"减少侧连接"模式。映射器发出连接/外键作为键,记录作为值。

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

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)

在化简器中,我们将得到这个:

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

从这里,您可以根据需要执行内部连接逻辑。为此,您只需将每个项目与其他项目匹配即可。为此,请将其数据加载到数组列表中,然后在这些项目上执行 N x N 循环以相互比较。

意识到化简侧联接的成本很高。如果您不过滤掉任何内容,它们会将几乎所有数据发送到化简器。另外,要小心将数据加载到化简器中的内存中 - 您可以通过加载数组列表中的所有数据来在热连接键上炸毁堆。


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


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

select * from tablea, tableb;

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

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


插入我的书:MapReduce Design Patterns。它应该在几个月内发布,但如果你真的感兴趣,我可以通过电子邮件将有关加入的章节发送给您。

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

相关内容

  • 没有找到相关文章

最新更新