在算法中,各个排序算法的复杂度都比较高,正常情况下为O(nlogn) ,所以当数据量特别大的时候,对数组进行排序消耗都很大。
因为hive的计算引擎MapReduce是分布式系统,
利用分布式的特点,可以对排序的数据各个机器节点内有序,再做归并排序,
虽然这样做的复杂度还是O(nlogn) ,
但是对比老版本hive的做法,改善不少。
老版本hive的order by并不是做归并排序,而是将所有数据都集合到一台机器上,然后做一个全局排序,
这样做的缺点就是,
一个没办法利用分布式系统的并发计算,因为在一台机器上,这台机器的cpu压力很大,
第二个缺点是这台机器的内存压力也很大,因为计算要发生在内存中,数据量很大的情况下,一台机器的内存并放不下这么多的数据。
在maxcompute一些系统中,order by的时候会要求你加上limit字段
尽管已经用归并排序做了优化,但是在大数据统计中,全局排序的场景也不太常见,
针对计算topN的排序,只要限制了limit字段,每台机器都可以只排序前N条数据,然后对N条数据做归并排序,
速度上快了很多,毕竟,我们可能只需要计算top一万,但是总数据量可能有一亿(总数据量总是高的离谱,但top范围总是很低的)。
hive还提供了一个order by 的弱化版本,就是sort by,减去了最后一个归并排序,只要各个机器节点里的数据有序就行了
比如n条数据,被分成n/m条数据,那么复杂度就是 (n/m)*(m)*log(m)=nlogm,分的越离散(m越小),速度越快,
因为不需要最后做归并排序(m越小,数据条数就越多,归并排序的时候就越耗时)
关于n条如何被分为m条,需要用distribute by指定字段,比如指定name,这样就可以保证相同name的数据有序了。
为什么说sort by 是order by 的弱化版本,
因为没有了最后一步归并排序,所以最后的结果不是全局有序的,只是局部有序的