表达式" IS NOT NULL"没有在HQL上工作

时间:2016-05-19 12:34:18

标签: null hive hql

当我在配置单元表上为非空值执行select语句时,响应中没有正确的结果。结果就好像"不是空的"表达不存在!

示例

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

注意test_col_id1test_col_id2不是分区键。

这是我的蜂巢版本。

  

Hive 0.14.0.2.2.0.0-2041

这是表格:

... | test_col_id1 | test_col_id2 |
...... | 12345 | x |
...... | 12345 | NULL |

此查询返回2条记录。

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”。