9

我想使用 Java MapReduce 在 Hadoop 中的两个数据集上执行代价高昂的叉积运算。

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

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

不寻找任何代码,只是想从高层次上了解我应该如何解决这个问题。

4

1 回答 1

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 节点开发集群上),计算了数百万个交叉产品。

我还可以对算法进行改进,因为某些文档永远不会与其他文档相比得分很高(例如,如果它们之间的时间时间过长),并因此产生更好的分割。

于 2012-04-28T19:52:19.017 回答