在Hive中处理NULL值

时间:2013-08-25 19:38:59

标签: null hive

我正在尝试从另一个表(表1)在Hive中创建一个表(表2)。我试图用NULL值排除某些行并尝试以下条件。

    insert overwrite table table2 partition (date = '2013-06-01')
    select column1, column 2....
    from table1
    where column1 is not NULL or column1 <> '';

然而,当我尝试使用新表进行以下查询时,我得到300行以及NULL值:

    select count(*) from table2 where column1 is NULL;

有人可以指出导致这些NULL值的原因吗?

谢谢。

拉​​维

6 个答案:

答案 0 :(得分:20)

首先 - 我认为column1 is not NULL or column1 <> ''没有多大意义。也许你打算写column1 is not NULL and column1 <> ''AND而不是OR)?

其次 - 由于Hive对表定义的“读取模式”方法,当您从中读取时,无效值将转换为NULL。因此,例如,如果table1.column1类型为STRINGtable2.column1类型为INT,那么我认为table1.column1 IS NOT NULL不足以保证table2.column1 IS NOT NULL。 (不过我对此并不确定。)

答案 1 :(得分:6)

尝试包含长度&gt; 0也是。

column1 is not NULL AND column1 <> '' AND length(column1) > 0 

答案 2 :(得分:2)

Hive表中column1的数据类型是什么?请注意,如果您的列是STRING,即使您的外部文件没有该列的任何数据,它也不会具有NULL值。

答案 3 :(得分:1)

尝试使用isnull(a),isnotnull(a),nvl()等。在某些版本(可能与服务器设置一起 - 至少与我正在处理的那个)的蜂巢中,“#is; is is NULL&#39;并且&#39;不是空的&#39;语法在编译时不执行逻辑。查看 here 了解详情。

答案 4 :(得分:0)

要检查column1的 NULL 数据并考虑它的数据类型是String,可以使用以下命令:

select * from tbl_name where column1 is null or column1 <> '';

答案 5 :(得分:0)

我在下面的sql中使用以排除空字符串和空字符串行。

select * from table where length(nvl(column1,0))>0

因为,空字符串的长度为0。

select length('');
+-----------+--+
| length()  |
+-----------+--+
| 0         |
+-----------+--+