hive字符串底层排序导致的bug

hive底层排序原理

        在 Hive 中,当对字符串类型的字段使用 ORDER BY 进行排序时,排序是基于字符串的**字典序(lexicographical order)**进行的。从字符串的第一个字符开始,按照字符的Unicode码点,逐个字符进行比较,直到找到不同的字符或到达字符串末尾。

        所以对于数字字符串来说,也同样是该规则。若排序时出现100是比99小,且100具体的位置是在10和11之间。这就是因为本来应该是int类型的字段,在建表时却为string类型。

实例展示

先创建一个表

create table test(
    id int,
    num string
);

insert into test values (10,'99'),(11,'100'),(99,10),(100,11);

根据不同字段的查询结果

select * from test order by id ;
id num
10,99
11,100
99,10
100,11
select * from test order by num ;

id num
99,10
11,100
100,11
10,99

已经尝试过,order by 和sort by 的结果均为这样。

解决方法

1、进行排序时,将该字段的类型进行转换

select * from test order by cast(num as int);

id num
99,10
100,11
10,99
11,100

2、根据hash值进行排序

select * from test order by hash(num);

id num
99,10
100,11
10,99
11,100

展开一下

        若底层不是根据hash值进行比较的,那么max,min也同样不会出现想要的结果,为了展示结果,先将表中字符串值为10的数据删除。

select min(num) min from test;

min
100

select max(num) max from test ;
max
99

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值