MapReduce中的交叉产品

时间:2012-04-28 17:41:07

标签: hadoop mapreduce

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

例如,我有来自数据集A和数据集B的记录,并且我希望数据集A中的每个记录与输出中的数据集B中的每个记录匹配。我意识到这个的输出大小是|A| * |B|,但是无论如何都要这么做。

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

不寻找任何代码,只想高层了解我应该如何处理这个问题。

1 个答案:

答案 0 :(得分: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节点开发群集上),计算出数百万的交叉产品。

我还可以对算法进行改进,因为有些文档永远不会很好地与其他文档进行比较(例如,如果它们之间有太多的时间间隔),并因此产生更好的分割。