Hive Order By、Sort By、Distribute By、Cluster By

Posted by Jackson on 2017-09-09

Hive 中的order by、sort by、distribut by、cluster by

Order By

order by 是全局排序,只能够有一个reduce作业来完成,多个reduce时候保证不了全局有序

通过参数 hive.mapred.mode 进行查看当前的模式

非严格模式下:order by 后面不需要加limit

严格模式下:
普通表:order by 需要加上limit
分区表:需要加上分区字段,然后进行order by + limit

严格模式下面order by 加limit 的原因?

当使用order by 的时候需要将数据发送到同一个reduce中去,如果数据量特别大,会导致该reduce的执行时间特别长,所以要加上limit进行限制,默认的排序规则是按照升序进行排列。
需要慎用

Sort By

能保证每个分区有序:每个redcue的输出结果是有序的,不受严格模式影响
sort by 的字段可以是多个
sort by 是分数据类型的
数值类型 按照数字顺序进行排序
字符串类型 按照字典顺序进行排序

Distribute By

作用:distribute by 只是做数据的分发,将distribute by 指定的字段的数据发送到不同的reduce上面去,
相当于MapReduce中的Partition操作,通常和sort by 连用,按照col分发数据,将不同的reduce中的数据进行排序

Cluster By

cluster by is a short-cut for both Distribute By and Sort By.
当sort by 和distribute by 的字段相同的时候可以简写为Cluster By

By 总结

  • order by 全局 一个reduce 大数据量下 效率低
  • sort by 每个reduce内有序,不能保证全局有序
  • distribute by 是按照指定字段进行数据分发,常与sort by连用,确保每个reduce内有序
  • cluster by = distribute by + sort by

补充:MR中有多少个reduce作业就对应多少个输出文件
Spark 中有多少个task就有多少个输出文件