我想使用Java MapReduce在Hadoop中跨两个数据集执行昂贵的跨产品操作.
例如,我有来自数据集A和数据集B的记录,并且我希望数据集A中的每个记录与输出中的数据集B中的每个记录匹配.我意识到这个的输出大小是|A| * |B|,但是无论如何都要这样做.
我看到猪有,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)
Run Code Online (Sandbox Code Playgroud)
我不记得它的性能如何,但有一个大小为数千的文档集可以相互比较(在 8 节点开发集群上),并计算了数百万个叉积。
我还可以对算法进行改进,因为某些文档永远不会比其他文档得分高(例如,如果它们之间的时间时间太多),并因此生成更好的分割。
| 归档时间: |
|
| 查看次数: |
2093 次 |
| 最近记录: |