hive中order by详解

order by的使用及讲解

1. order by的使用

大家都清楚在hive中order by是用来排序的,使用语法如下

SELECT * FROM tab_name ORDER BY column_name;

在使用order by的时候默认是按照升序进行排序的(ASC),字符串类型就是按照字典顺序进行排序的,数值类型就是按照数值的大小进行排序的具体列子如下:
表中数据:

goodsgtypeprice
口香糖食品10
薯片食品20
巧克力食品30
蛋糕食品40
薯条食品50
饼干食品60
面包食品70
月饼食品80
方便面食品90
洗衣粉日用品11
洗衣液日用品21
洗洁精日用品31
拖布日用品41
毛巾日用品51
卫生纸日用品61
水杯日用品71
水壶日用品81
椅子日用品91
电视电器12
电脑电器22
冰箱电器32
冰柜电器42
洗衣机电器52
小太阳电器62
电暖器电器72
电磁炉电器82
空调电器92
热水器电器102

表中字段price是int类型,其余都是string类型的
使用如下sql进行查询

select * from t_test order by price desc;

查询结果:

goodsgtypeprice
热水器电器102
空调电器92
椅子日用品91
方便面食品90
电磁炉电器82
水壶日用品81
月饼食品80
电暖器电器72
水杯日用品71
面包食品70
小太阳电器62
卫生纸日用品61
饼干食品60
洗衣机电器52
毛巾日用品51
薯条食品50
冰柜电器42
拖布日用品41
蛋糕食品40
冰箱电器32
洗洁精日用品31
巧克力食品30
电脑电器22
洗衣液日用品21
薯片食品20
电视电器12
洗衣粉日用品11
口香糖食品10

这里我使用的倒序(desc)进行排序的,可以看到表中数据是以字段price进行倒序排序的,通常我们使用order by的时候都是但字段进行排序的,但是有的时候也会使用到多字段进行排序,在使用多字段排序的时候,我们需要在order by后的每个字段后面都注明排序方式,具体语法如下

SELECT * FROM tab_name ORDER BY column_1 desc,column_2,desc,column_3....

需要进行倒序排序的时候要在字段后面添加desc,不添加默认是asc排序,多字段的排序规则是先将第一个出现的字段按照正序或者倒序进行排序,在排序好之后,在第一个字段值相同的情况下第二个字段在以正序 或者倒序的方式的进行排序,可以理解位以第一个字段值做分组再以第二个字段进行排序,查询sql如下

select
 goods,
 case gtype
 when '食品'
 then concat("7_",gtype)
 when '日用品'
 then concat("3_",gtype)
 when '电器'
 then concat("5_",gtype)
 end gtype
 ,
 price
from t_test
order by gtype,price desc;

结果如下:

goodsgtypeprice
椅子3_日用品91
水壶3_日用品81
水杯3_日用品71
卫生纸3_日用品61
毛巾3_日用品51
拖布3_日用品41
洗洁精3_日用品31
洗衣液3_日用品21
洗衣粉3_日用品11
热水器5_电器102
空调5_电器92
电磁炉5_电器82
电暖器5_电器72
小太阳5_电器62
洗衣机5_电器52
冰柜5_电器42
冰箱5_电器32
电脑5_电器22
电视5_电器12
方便面7_食品90
月饼7_食品80
面包7_食品70
饼干7_食品60
薯条7_食品50
蛋糕7_食品40
巧克力7_食品30
薯片7_食品20
口香糖7_食品10

因为gtype数据值都是汉字的,用来排序效果不容易看出来,所以都加了数字前缀,从结果可以看出来gtype是按照字典顺序的正序排序的,price字段是按照数值类型进行倒序排序的,通过这个例子就可以很直观看出来order by的排序规则。

2. order by在hive中的执行机制

order by是进行全局的排序,所以最终数据都会集中在一个reduce中,因为如果分散在多个reduce中就无法保证是全局排序,并且在hive使用order by的时候会受到如下属性的约束:

set hive.mapred.mode=nonstrict;
set hive.mapred.mode=strict;

默认是在nonstrict模式下的,如果在strict模式下使用order by的话必须使用limit关键字,因为如果数据量过大的话,执行的时间会非常长。
通过如下列子看一下:
首先设置位strict模式

set hive.mapred.mode=strict;

然后执行如下sql

 select * from t_test order by price;

结果如下

FAILED: SemanticException 1:30 Order by-s without limit are disabled for safety reasons. If you know what you are doing, 
please sethive.strict.checks.large.query to false and that hive.mapred.mode is not set to 'strict' to proceed. 
Note that if you may get errors or incorrect results if you make a mistake while using some of the unsafe features.. 
Error encountered near token 'price'
Error: Error while compiling statement: FAILED: SemanticException 1:30 Order by-s without limit are disabled for safety reasons. 
If you know what you are doing, please sethive.strict.checks.large.query to false and that hive.mapred.mode is not set to 'strict' to proceed. 
Note that if you may get errors or incorrect results if you make a mistake while using some of the unsafe features.. Error encountered near token 'price' (state=42000,code=40000)

第一行就出现了“Order by-s without limit”,可以看到设置为strict模式后,不加limit是无法执行order by语句的
加上limit关键字,sql如下

select * from t_test order by price limit 7;

结果如下:

goodsgtypeprice
口香糖食品10
洗衣粉日用品11
电视电器12
薯片食品20
洗衣液日用品21
电脑电器22
巧克力食品30
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Hiveorder by和sort by都是用于对查询结果进行排序的语句,但它们的实现方式和使用场景略有不同。 order by是在查询结果生成后,对整个结果集进行排序,可以使用多个字段进行排序,但是会将整个结果集加载到内存进行排序,因此在处理大数据量时可能会出现性能问题。 sort by是在map阶段对数据进行局部排序,然后在reduce阶段进行合并,因此可以处理大数据量的排序,但是只能使用一个字段进行排序。 因此,当需要对整个结果集进行排序时,应该使用order by;当需要处理大数据量时,应该使用sort by。 ### 回答2: HiveOrder by和Sort by都是用来排序的语句,但它们有一些不同之处。 Order by是一个全局排序,它在所有数据被收集后进行排序。这意味着它需要对整个数据集进行一次排序,因此非常消耗性能和时间。在使用Order by时,会将数据全部放入内存缓存进行排序,如果数据量过大,会导致内存不足而出现错误。 Sort by是在每个Reducer操作之前发生的本地排序。这意味着Sort by只会对单个Reducer内的数据进行排序,而不需要对整个数据集进行排序。在使用Sort by时,不同的Reducer会对数据进行排序,每个Reducer生成有序的数据,最终将它们合并到一起,从而形成整个数据集的有序结果。 相比之下,Sort by的性能比Order by要好得多。因此,当需要对大量数据进行排序时,我们通常建议使用Sort by而不是Order by。但是,需要注意的是,Sort by只能在处理器上进行排序,不像Order by是在集群上进行全局排序。因此,当需要对整个数据集进行排序而不仅仅是数据分区时,应该使用Order by。 总的来说,Order by和Sort by在Hive都是用来排序的语句,它们的区别在于排序的颗粒度和性能。在实际应用,我们需要根据具体的情况,选择合适的排序方式,以便实现最佳的性能表现。 ### 回答3: Hiveorder by和sort by都是用来对查询结果进行排序的操作,但它们有一些细微的差别。 首先,order by是在所有的reduce task之后进行的全局排序,它可以对查询结果进行任意的排序操作,并且可以指定多个排序键,并且还可以指定排序顺序,包括升序和降序。但是,由于order by是在所有的reduce task之后进行的全局排序,因此需要将所有的查询结果加载到内存进行排序,所以在处理大数据量时可能会出现内存溢出的问题。 而sort by只是在各个map task进行的局部排序,它只能指定一个排序键,并且只能按照升序排序,但是它的排序是在map task结束后立即进行的,因此可以减少大量数据在内存的等待时间。因此,当处理大数据量的时候,sort by更加适用。 此外,另一个不同之处在于,order by可以用于分区表和非分区表,而sort by只能用于非分区表。 综上所述,当处理小量数据时,order by和sort by的效率差别不大,但处理大量数据时,sort by的效率要比order by高。在使用时,需要根据具体情况来选择合适的操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值