引言
Sort操作也是SQL中常用的操作,一般来说,Sort操作在SQL语句中有两种体现,即Sort by和Order by。这两种的区别是前者是针对分区内排序,而后者是对全表进行一个排序。那有的人问了,全表排序可以理解,那分区排序针对于什么场景呢?通常是在SQL语句中搭配distributed by一起使用,先将表按照某些字段进行分区,然后在分区内进行排序,能够很好的看清分区内的数据分布。
Sort by和Order by
SparkSQL中也不例外,Sort by和Order by这两种语法均支持。而Sort by仅作为分区内排序,是Order by排序过程的一部分。即Order by先针对数据按照字段进行分区,再在每个分区内对数据进行排序(即Order by的操作)。表示成图如下:
如上图,第一个红色箭头表示按照顺序重分区,保证第n-1个分区内的数据在排序上前于第n个分区内的数据。第二个红色箭头是分区内排序,即对第n个分区,保证第m-1个元素在顺序上早于第m个元素。经过这两个步骤之后,就能保证全表是一个有序的集合了。
而Sort by只进行第二个步骤,即只保证分区内的数据有序。
顺序分区的实现
通常进行shuffle,Partitioner按照hash co