Hive的排序和分区

Hive中的排序问题

order by 全局排序(慎用)

默认是升序asc,可指定降序desc。
order by是全局排序 只能有一个reduce作业来完成才能保证数据有序,这也是慎用的原因,数据太多容易导致计算

hive默认是非严格模式
hive.mapred.mode改为strict,则使用order by的时候有以下限制:

  • 如果是普通表,则需要加 limit
    order by + limit
  • 如果是分区表则:
    需要加 limit
    需要限定分区条件即
    order by + limit
    where partition column

sort by 分区排序

mapred.reduce.tasks指定reduce的个数
sort by能保证每个分区有序,你有几个reduce作业,每个reduce输出的结果是有序
sort by不受hive.mapred.mode=strict影响,col可以是多个。
如果数值是数值类型,那么按照数字排序
如果数值是字符串类型,那么按照字典顺序排序

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

distribute by 发送分区排序

不是排序。+ col,根据指定的字段把数据分发到不同的reduce上去。相当于MapReduce中的Partitioner,通常与sort by连用

Cluster By

根据by的值的hash值进行分区和排序,分发到不同的reduce
当Distribute By和Sort By的字段相同是,就等价于cluster by

总结

order by:全局有序,只有一个reduce,大数据量下的场景下,效率低。相关参数hive.mapred.mode影响其是否需要加限制条件

sort by:多个每个reduce内有序,不能保证全局有序。
mapred.reduce.tasks指定reduce的个数,不受hive.mapred.mode的影响。

distribute by:是按照指定字段进行数据分发,常与sort by连用,确保每个reduce内有序。语句顺序,先 distribute by 再 sort by.
cluster by = distribute by + sort by

思考:需求:业务统计结果要求有序。
order by用不了啊,sort by又不能保证全局有序,咋整????
(根据需要排序的字段查看字段值分布,先distribute by再sort by)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值