我正在尝试从另一个表(表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值的原因吗?
谢谢。
拉维
答案 0 :(得分:20)
首先 - 我认为column1 is not NULL or column1 <> ''
没有多大意义。也许你打算写column1 is not NULL and column1 <> ''
(AND
而不是OR
)?
其次 - 由于Hive对表定义的“读取模式”方法,当您从中读取时,无效值将转换为NULL
。因此,例如,如果table1.column1
类型为STRING
且table2.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 |
+-----------+--+