hive数据排序

本文详细介绍了Hive中的四种排序方法:ORDERBY的全局排序、SORTBY的分区内排序、DISTRIBUTEBY的数据分布控制和CLUSTERBY的分区排序简化。特别强调了ORDERBY在大规模数据下的潜在问题以及SORTBY、DISTRIBUTEBY和ClusterBy的配合使用。
摘要由CSDN通过智能技术生成

hive有四种排序方法: ORDER BY 、SORT BY 、DISTRIBUTE BY 、CLUSTER BY

1. 全局排序(Order By)

Order By会对输入做全局排序,因此只有一个Reducer(多个Reducer无法保证全局有序),然而只有一个Reducer,会导致当输入规模较大时,消耗较长的计算时间。

  • 降序:desc。

  • 升序:asc ,不需要指定,默认是升序。

需要注意的是它受hive.mapred.mode的影响,在严格模式下,必须使用limit 对排序的数据量进行限制,因为数据量很大只有一个reducer的话,会出现OOM 或者运行时间超长的情况,所以严格模式下,不适用limit 则会报错,更多请参考Hive的严格模式和本地模式。

2. 分区内排序(Sort By)

不是全局排序,其在数据进入Reducer前完成排序,也就是说它会在数据进入Reduce之前为每个Reducer都产生一个排序后的文件。因此,如果用Sort By进行排序,并且设置mapreduce.job.reduces>1,则Sort By只保证每个Reducer的输出有序,不保证全局有序。

它不受hive.mapred.mode属性的影响,Sort By的数据只能保证在同一个Reduce中的数据可以按指定字段排序。使用Sort By你可以指定执行的Reduce个数(通过set mapred.reduce.tasks=n来指定),对输出的数据再执行归并排序,即可得到全部结果。

3. 分区(Distribute By)

Distribute By是控制在Map端如何拆分数据给Reduce端的。类似于MapReduce中分区Partationer对数据进行分区,hive会根据Distribute By后面的列,将数据分发给对应的Reducer,默认是采用Hash算法+取余数的方式。

Sort By为每个Reduce产生一个排序文件,在有些情况下,你需要控制某写特定的行应该到哪个Reducer,这通常是为了进行后续的聚集操作。Distribute By刚好可以做这件事。因此,Distribute By经常和Sort By配合使用。

4.分区排序(Cluster By)

Cluster By除了具有Distribute By的功能外还兼具Sort By的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。当分区字段和排序字段相同Cluster By可以简化Distribute By+Sort By 的SQL写法,也就是说当Distribute By和Sort By 字段相同时,可以使用Cluster By代替Distribute By和Sort By。

总结

Order By 是全局排序,可能性能会比较差;

Sort By分区内有序,往往配合Distribute By来确定该分区都有那些数据;

Distribute By 确定了数据分发的规则,满足相同条件的数据被分发到一个Reducer;

Cluster By 当Sistribute By和Sort By 字段相同时,可以使用Cluster By代替Distribute By和Sort By,但是Cluster By默认是升序,不能指定排序方向。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值