我有一个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
答案 0 :(得分:0)
这种差异来自您的空值。 Hive将执行从字符串到double(和int到double)的隐式转换,尝试比较值(您可以看到隐式转换表here),但是对于空值(或非数值),比较结果将为null,使你的where条件为假
select "0" <> 0; -- false
select "hlagos" <> 0; -- NULL
select "" <> 0; -- NULL
比较正确的数据类型
时不会发生这种情况select "" <> "0"; -- true