我想使用Java MapReduce在Hadoop中跨两个数据集执行交叉乘积的昂贵操作。
例如,我有来自数据集 A 和数据集 B 的记录,我希望数据集 A 中的每条记录都与输出中数据集 B 中的每条记录匹配。我意识到这样做的输出大小会|A| * |B|
,但无论如何都想这样做。
我看到 Pig 已经CROSS
,但不知道它是如何在高层次上实现的。也许我会去看看源代码。
不是在寻找任何代码,只是想在高层次上知道我应该如何处理这个问题。
我在查看文档相似性(将文档与其他每个文档进行比较)时做了类似的事情,最终得到了一种自定义输入格式,该格式将两个数据集拆分,然后确保每个数据子集都有"拆分"。
所以你的拆分看起来像(每组合并两组 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 节点开发集群上),并计算了数百万个交叉产品。
我还可以对算法进行改进,因为某些文档永远不会比其他文档得分很高(例如,如果它们之间有太多的时间时间),并因此产生更好的拆分。