方案一:用order by进行排序
由于order by 会对数据进行全局排序导致所有数据分到一个分区里
全局排序只会用到一个ReduceTask大大影响性能并造成数据倾斜
方案二:使用sort by进行排序
使用sort by进行排序会需要先设置Reduce Task的数量>= 1
他会把数据分到各个Reduce Task里面进行排序但是这样也有问题他可能有分配不均匀问题导致一个Reduce Task的数量特别多导致数据倾斜
方案三:使用distribute by + sort by进行排序
distribute by可以通过指定字段然后再通过字段的hash值对分区数取余然后分到各个分区里面这样大大避免了数据倾斜的可能性然后再使用sort by对每个分区进行排序这样就组成了内部有序外部无序的数据集,但是他也不不能达到最终全局排序的结果需要进行一次归并排序
方案四:使用distribute by + sort by +order by进行排序
如:
SELECT * FROM (
SELECT * FROM emp DISTRIBUTE BY deptno SORT BY sal
) t
ORDER BY t.sal DESC;
可以实现