两个大小的数据集上的原始连接 N
以及 M
是 O(N*M)
.
两个数据集的排序都是 O(N*log(N)+M*log(M))
已排序数据集上的联接为 O(N+M)
因此:对未排序的数据执行连接(假设数据集的大小不是指数不平衡的: M>>log(N)
以及 N>>log(M)
)是对道普的亵渎。
同时,Pig和Spark似乎都没有想到这一点。他们甚至没有提到按键对数据进行分区的简单想法,这会将节点间通信减少到0。
我错过了什么?为什么这个问题被忽视了?
连接确实需要相当长的时间,所以加速连接并不是一个疯狂的想法(同样的道理 group by
,顺便说一句)。
另外,我知道连接不是用愚蠢的方式完成的,而是用那种方式。但是,每次我执行连接时都会执行这种排序;我不能对集合进行一次排序,然后让所有将来的联接都从中受益。请注意,排序比排序后的联接更昂贵!请注意,传统的关系数据库早就有了索引的概念!
1条答案
按热度按时间db2dz4w81#
mapreduce作业的高级流是map->shuffle->sort->reduce。
mapreduce连接通常在reduce阶段完成,此时数据已经被排序。