16

我正在尝试从另一个表(表 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 值的原因吗?

谢谢你。

拉维

4

6 回答 6

26

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

其次 - 由于 Hive 对表定义的“读取模式”方法,无效值将被转换为NULL当您从它们读取时。因此,例如,如果table1.column1is of typeSTRING并且table2.column1is of type INT,那么我认为这table1.column1 IS NOT NULL不足以保证table2.column1 IS NOT NULL. (不过,我不确定这一点。)

于 2013-08-25T19:53:58.060 回答
7

尝试包括长度> 0。

column1 is not NULL AND column1 <> '' AND length(column1) > 0 
于 2014-09-30T20:37:14.683 回答
2

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

于 2013-08-27T06:54:53.480 回答
1

尝试使用 isnull(a)、isnotnull(a)、nvl() 等。在 hive 的某些版本(可能与服务器设置结合 - 至少与我正在处理的设置结合使用)上,“IS NULL”和“IS NOT” NULL' 语法在编译时不执行逻辑。在这里查看更多信息。

于 2017-10-17T17:51:23.193 回答
0

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

select * from tbl_name where column1 is null or column1 <> '';
于 2017-03-31T11:55:15.377 回答
0

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

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

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

select length('');
+-----------+--+
| length()  |
+-----------+--+
| 0         |
+-----------+--+
于 2018-08-17T06:30:40.137 回答