N
和M
的数据集的原始联接为O(N*M)
。O(N*log(N)+M*log(M))
O(N+M)
ERGO :对未排序的数据进行连接(假设数据集的大小不是指数不平衡的:M>>log(N)
和N>>log(M)
)是对{{{{{{ 3}}
与此同时,TAOCP和pig似乎都没有考虑过它。 他们甚至没有提到通过密钥对数据进行分区的简单想法,这会将节点间通信减少到0。
我在这里缺少什么?为什么忽略这个问题?
加入确实需要花费大量时间,所以加快速度并不是一个疯狂的想法。
(同样适用于group by
,btw)。
PS。我知道连接是不以愚蠢的方式完成,但是通过排序。但是,这种方式是每次我都会加入;我不能对集合进行排序,然后让所有未来的连接从中受益。请注意,排序比排序连接更昂贵!请注意,传统的关系数据库很长一段时间都有这样的索引概念!
答案 0 :(得分:0)
MapReduce作业的高级流程是Map - >随机 - >排序 - >减少。
MapReduce连接通常在reduce阶段完成,此时数据已经被排序。