当我在配置单元表上为非空值执行select语句时,响应中没有正确的结果。结果就好像"不是空的"表达不存在!
示例:
select count(*)
from test_table
where test_col_id1='12345' and test_col_id2 is not null;
注意test_col_id1
和test_col_id2
不是分区键。
这是我的蜂巢版本。
Hive 0.14.0.2.2.0.0-2041
这是表格:
... | test_col_id1 | test_col_id2 |
...... | 12345 | x |
...... | 12345 | NULL |
此查询返回2条记录。
答案 0 :(得分:6)
尝试以下查询,是否返回行?
Array
(
[0] => Array
(
Array
(
[0] => Array
(
[0] => 1
[1] => 1
[2] =>
[3] =>
)
[1] => Array
(
[0] => 2
[1] =>
[2] => 2
[3] =>
)
[2] => Array
(
[0] => 3
[1] => 9
[2] => 7
[3] => 3
)
)
)
[1] => Array
(
[0] => 'source_1'
[1] => 'source_2'
[2] => 'source_3'
)
)
然后,您的select count(*)
from test_table
where test_col_id1='12345' and test_col_id2 != 'NULL';
不是NULL
,而是字符串' NULL'。 Had对NULL
字符串的处理有很多问题。默认情况下,它是空字符串NULL
。如果我们需要其他任何东西,我们必须准确指定在创建表时应该处理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
答案 1 :(得分:0)
Hive以不同的方式解析NULL值。
Hive不认为空值为NULL。但是,默认情况下,Hive使用\N
来表示
NULL(不是特殊字符,只是反斜杠加大写字母N)。
如果您只想过滤掉所有空值,可以使用
where test_col_id2 != ''
如果你在原始文本文件中使用了真正的NULL值,那么你可以尝试
where test_col_id2 != '\000'
因为octonary中的ASCII代码为NULL,而第一个“0”表示它是一个八进制数。
顺便说一下,你也可以使用命令:
alter table $YOUR_TABLE SETSERDEPROPERTIES('serialization.null.format' ='abc')
如果希望Hive将“abc”解析为某个表的NULL值,则将NULL值自定义为“abc”。