2012-04-28 53 views
9

我想使用Java MapReduce在Hadoop中跨两个数据集执行跨产品的昂贵操作。MapReduce中的交叉产品

例如,我有来自数据集A和数据集B的记录,并且我希望数据集A中的每条记录都匹配到输出中数据集B中的每条记录。我意识到,这将是|A| * |B|的输出大小,但想要做它反正。

我看到Pig有CROSS但我不知道它是如何在高层实现的。也许我会去看看源代码。

不寻找任何代码,只是想知道在高层我应该如何处理这个问题。

+0

您是否可以将A的全部或全部B放入一个工作人员的记忆中?然后它非常简单。 – 2012-04-28 18:37:25

+0

@SeanOwen我希望!不幸的是,这种情况并非如此。我在考虑的一种方法是将数据集B分成10-100左右的分组,然后一次运行10-100个不同的mr作业。 – 2012-04-28 19:12:26

回答

3

在查看文档相似性(将文档与其他文档进行比较)时,我做了类似的事情,并以自定义输入格式结束了两个数据集,然后确保每个子集都有一个“分割”数据。

所以,你的分裂会是什么样子(每个合并两套10条记录,输出100条记录)

A(1-10) x B(1-10) 
A(11-20) x B(1-10) 
A(21-30) x B(1-10) 
A(1-10) x B(11-20) 
A(11-20) x B(11-20) 
A(21-30) x B(11-20) 
A(1-10) x B(21-30) 
A(11-20) x B(21-30) 
A(21-30) x B(21-30) 

我不记得是怎么高性能是,虽然,但有一个文档中的大小顺序设置成千上万的数据进行比较(在8节点开发集群上),并计算出数以百万计的交叉产品。

我也可以对算法进行改进,因为有些文档对其他人来说不会得到很好的分数(如果他们之间有太多的时间间隔),并且产生更好的分割效果。

+0

这太棒了。非常干净,因为它的所有配对都是由输入格式完成的。谢谢! – 2012-04-28 20:09:48

+0

@克里斯这是美妙的方法。我想知道如果你可以分享你如何编写“自定义输入格式”或可能是代码。这将有所帮助。 – 2012-04-30 02:44:55

+0

@justinwaugh - 我会看看如果我可以挖掘出一些东西,并写上博客文章,我一定会从这里链接它 – 2012-04-30 13:23:07