我对MapReduce相对陌生,我想到了以下问题:如何在MapReduce中计算完整(即不稀疏)的距离矩阵?
我有一个包含N个实例的2D数据集,我必须评估这些点之间的所有可能距离,并将它们存储在矩阵中。
到目前为止,我所做的是
- 让Map检索其块,评估这些点之间的距离:得到的矩阵将是一个具有一些距离和一些零的NxN矩阵
- Reduce将连接(求和)这些矩阵,然后填充空白(即块内距离,仍然为零的元素)
我认为这不是很有效(尤其是从记忆的角度来看)。
有人能启发我吗?
更新:我在上面的代码中做了一些优化。现在
- Map接收其块并评估这些点之间的距离,而不预先分配NxN矩阵,而是预先分配Nx3矩阵(第一列在点A,第二列是点B,第三列是dist(A,B))
- Reducer预分配完全由零填充的NxN矩阵。现在填充Map计算的距离(块间),然后填充空白(即块内距离,仍然为零的元素)
毫无疑问,这是一个更好的解决方案,因为Mapper不需要构建整个NxN矩阵,但我认为它可以做得更好。
我就是这么做的:Map任务只是评估给定实例j
和所有其他实例之间的距离。Reducer将这些距离连接到写入磁盘的向量中。这样的记录实际上是矩阵的第CCD_ 2行。所有实例都是这样,然后写在磁盘上的所有记录都连接在一起。