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 版本,即<=>
。所以,你可以这样做:
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 子句删除空值的主要内容,如果未能解决你的问题,请参考以下文章