order by
- order by (asc|desc)类似于标准的sql
- order by是全局排序,且只会使用一个Reducer干活。
- 速度很慢,使用前要做好数据过滤的工作,否则就等着加班吧。
- 支持使用case when或者表达式
就是,order by会对所给的全部数据进行全局排序,并且只会“叫醒”一个reducer干活。所以,数据量很大时,速度就会很慢,如果必须要使用order by进行排序,请做好数据的过滤工作。
sort by
- sort by
- sort by是局部排序,会对每个Reducer中的数据进行排序。
- 当Reducer的数量设置为1时,等同与order by。
通俗讲,sort by是局部排序。相比于order by,sort by会根据数据量的大小启动一到多个reducer来干活,并且,它会在进入reduce之前为每个reducer都产生一个排序文件。这样的好处是提高了全局排序的效率。
distribute by
- distribute by类似于标准sql中的group by
- 确保具有匹配列值的行被分区到相同的Reducer。
- 不会对每个Reducer的输出进行排序。
- 通常使用在sort by 之前。
distribute by相当于MapReduce中的partition,控制map结果的分发,将具有相同字段的map输出分发到一个reduce节点上做处理。distribute by通常与sort by一起使用,且支持distribute by分区的列与sort by排序的列不是同一个列。
举个栗子:
distribute by 后面的用于分区的字段department_id必须要出现在select与from之间。
cluster by
- cluster by相当于distribute by+sort by
- 不支持asc和desc。
- 排序列必须出现在select column列表中。
如果sort by 和 distribute by 中所用的列相同,可以缩写为cluster by以便同时指定两者的列。
823

被折叠的 条评论
为什么被折叠?



