我想使用 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 节点开发集群上),计算了数百万个交叉产品。
我还可以改进算法,因为有些文档永远不会比其他文档得分高(例如,如果它们之间的时间间隔太长),并因此生成更好的拆分。
关于hadoop - MapReduce 中的叉积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10365948/