表达式“is not null”不适用于hql

zaq34kh6  于 2021-06-29  发布在  Hive
关注(0)|答案(2)|浏览(865)

当我对配置单元表上的非空值执行select语句时,响应中没有正确的结果。结果就像“is not null”表达式不存在一样!
例子:

select count(*)
from test_table
where test_col_id1='12345' and test_col_id2 is not null;

注意 test_col_id1 以及 test_col_id2 不是分区键。
这是我的Hive版本。
Hive0.14.0.2.2.0.0-2041
这是table:
... | 测试|列id1 |测试|列id2 |
... | 12345 | x |
... | 12345 |空|
此查询返回2条记录。

flvlnr44

flvlnr441#

尝试以下查询,它是否返回行?

select count(*)
from test_table
where test_col_id1='12345' and test_col_id2 != 'NULL';

然后你的 NULL 不是 NULL ,它是字符串“null”。很多人对Hive治疗有问题 NULL 串。默认情况下,它是空白字符串。 '' . 如果我们还需要其他任何东西,我们必须准确地指定在创建表时处理空字符串的方式。下面是3个例子,说明如何改变被认为是 NULL . 第一个将“null”字符串设置为 NULL :

CREATE TABLE nulltest1 (id STRING, another_string STRING)
TBLPROPERTIES('serialization.null.format'='NULL') --sets the string 'NULL' as NULL;
CREATE TABLE nulltest2 (id STRING, another_string STRING)
TBLPROPERTIES('serialization.null.format'='') --sets empty string as NULL;
CREATE TABLE nulltest3 (id STRING, another_string STRING)
TBLPROPERTIES('serialization.null.format'='\N'); --sets \N as NULL;

因为已经创建了表,所以可以更改表,以便它能够识别 'NULL' 作为 NULL :

ALTER TABLE test_table SET TBLPROPERTIES ('serialization.null.format' = 'NULL');
isr3a4wc

isr3a4wc2#

配置单元以不同的方式分析空值。
配置单元不认为空值为null。但是,默认情况下,hive使用 \N 表示null(不是特殊字符,只是反斜杠加大写字母n)。如果只想过滤掉所有空值,可以使用 where test_col_id2 != '' 如果在加载到配置单元表中的原始文本文件中使用实际的空值,可以尝试 where test_col_id2 != '\000' 因为八进制中null的ascii码是00,第一个“0”表示它是一个八进制数。
顺便说一下,您还可以使用命令:

alter table $YOUR_TABLE SETSERDEPROPERTIES('serialization.null.format' ='abc')

如果您希望配置单元将“”解析为某个表的空值,则可以将空值自定义为“”。

相关问题