在hive中将字符串与int进行比较时会发生什么

时间:2018-06-14 03:25:05

标签: hive hiveql

我有一个hive表A,它有一个uuid列,其类型是字符串

我想计算uuid不为0的uuids数量,我在下面写了sql

select
    count(distinct union_id)
from
   A
where dt = 20180610 and (union_id <> 0)

结果约为200万。

据我所知,我桌上的uuid大约有2000万,所以我开始检查错误。

最后,我发现我的uuid列是string,而不是int。我想也许有一些演员将uuid转换为0。然后我修改了我的程序如下:

select
   count(distinct union_id)
from
   A
where dt = 20180610 and (union_id <> '0')

它按照我的预期给出了大约2000万的数字。

我的uuid有两种格式,一种是长字符串,有很多字母,另一种只是一个数字字符串。我想第二种格式将被转换为0,但我不确定。

有人可以解释一下吗?

谢谢!

这里有一些uuid例子:

BE04A886FAE1F6BC00015A3A4C259466106F1EA587D74140E762E093FA6D58BB
9AF57081FE81FEA1EF88B293F82029418F6FBA19D8EB0F8BCCAEC3F033681F94
-8255088809384245133
976054595992186950

1 个答案:

答案 0 :(得分:0)

这种差异来自您的空值。 Hive将执行从字符串到double(和int到double)的隐式转换,尝试比较值(您可以看到隐式转换表here),但是对于空值(或非数值),比较结果将为null,使你的where条件为假

select "0" <> 0; -- false
select "hlagos" <> 0; -- NULL
select "" <> 0; -- NULL

比较正确的数据类型

时不会发生这种情况
select "" <> "0"; -- true