Hive 查询使用“not column=value”where 子句删除空值

Posted

技术标签:

【中文标题】Hive 查询使用“not column=value”where 子句删除空值【英文标题】:Hive query drops null values with "not column=value" where clause 【发布时间】:2017-03-30 14:19:10 【问题描述】:

table1 数据样本:

year month day utmsource
2017 03    26  NULL
2017 03    27  NULL
2017 03    27  facebook
2017 03    27  newsletter
2017 03    27  banner
2017 03    27  facebook    

预期选择:

year month day utmsource
2017 03    27  NULL
2017 03    27  newsletter
2017 03    27  banner 

我的 Hive 查询:

-- result = 0, it did not include the NULL utmsource record
SELECT SUM(CASE WHEN utmsource IS NULL THEN 1 ELSE 0 END) as amountnull
FROM table1
WHERE year=2017 AND month=03 AND day=27 AND NOT utmsource="facebook"

-- result = 1 the NULL utmsource record is included
SELECT SUM(CASE WHEN utmsource IS NULL THEN 1 ELSE 0 END) as amountnull
FROM table1
WHERE year=2017 AND month=03 AND day=27 AND (utmsource IS NULL OR NOT utmsource="facebook")

-- also returns 0, the NULL utmsource record is not included
SELECT SUM(CASE WHEN utmsource IS NULL THEN 1 ELSE 0 END) as amountnull
FROM table1
WHERE year=2017 AND month=03 AND day=27 AND NOT utmsource <=> 'facebook';

问题:

    有人能解释一下这种行为吗? 我可以将设置更改为 检索查询 2 的结果而不添加额外的 OR 我的查询中的功能? => 不等于在结果中包含空值

【问题讨论】:

NOT NULL --> NULL --> 不正确 这段代码一团糟。请提供数据样本。 【参考方案1】:

你想要的是一个NULL-safe 相等(或不相等)运算符。在 ANSI SQL 中,有一个称为 is distinct from 的运算符。 Hive 似乎使用 mysql 版本,即&lt;=&gt;。所以,你可以这样做:

SELECT SUM(CASE WHEN utmsource IS NULL THEN 1 ELSE 0 END) as amountnull
FROM tablename
WHERE year=2017 AND month=03 AND day=27 AND NOT utmsource <=> 'facebook';

documentation 中描述了此运算符。

我还应该指出,您可能会发现这是SELECT 的更简单的公式:

SELECT (COUNT(*) - COUNT(utmsource)) as amountnull
FROM tablename
WHERE year=2017 AND month=03 AND day=27 AND NOT utmsource <=> 'facebook';

尽管总的来说,这似乎是最简单的:

SELECT COUNT(*)as amountnull
FROM tablename
WHERE year=2017 AND month=03 AND day=27 AND utmsource IS NULL;

'Facebook' 的比较是不必要的。

【讨论】:

此操作数的文档指出:“对于非空操作数,使用 EQUAL(=) 运算符返回相同的结果,但如果两者都为 NULL,则返回 TRUE,如果其中一个为 NULL,则返回 FALSE。”在我的例子中,其中之一是 NULL,因此该子句返回 FALSE 而不是所需的 TRUE。 utmsource IS NULL where 子句不计算 utmsource 不同于“facebook”的记录。包含 sum(null) 以显示不存在空值 @JMordijck 。 . .确切地。当你做NOT false 时,你就明白了。这就是你想要的。否则,您将拥有NOT NULL,即NULL,而不是您想要的。 听起来不错,但是当我执行您的查询时,它也会返回 0 作为结果。当我执行 SELECT * 而不是计数时,它只显示 utmsource NOT NULL 且不等于 facebook 的记录。我想在这个结果中包含 NULL utmsource 记录 @JMordijck 。 . .有趣的。我无法解释 Hive 中的错误。这是它在 MySQL 中工作的一个示例:rextester.com/l/mysql_online_compiler.

以上是关于Hive 查询使用“not column=value”where 子句删除空值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Hive 中使用子查询

在选择查询中使用 hive 分桶

hive连接远程hadoop使用查询语句时,发生错误

hive中查询时可以使用中文别名吗

如何使用 hive 查询查找 hive json 数组字段的长度

Hive 查询不使用索引