将 HIVE 查询结果中的空值或 NULL 值替换为特定值

Replace the empty or NULL value with specific value in HIVE query result

我正在尝试显示默认值 "Others",但查询未 return 所选列之一的任何结果。我会告诉你这个例子。

此查询 return 是 os(agent) SO 的空值(第一行):

select country, os(agent) SO, count(*) from clicks_data
where country is not null and os(agent) is not null
group   by country, os(agent);

输出:

ZA           4
ZA  Android  4
ZA  Mac      8
ZA  Windows  5

相反,我想得到这个结果:

ZA  Others  4
ZA  Android 4
ZA  Mac     8
ZA  Windows 5

我的下一次尝试是这个查询,但它也没有真正起作用:

select country, regexp_replace(os(agent),'','Others') SO, count(*) from clicks_data 
where country is not null and os(agent) is not null 
group by country, os(agent);

这是结果:

ZA  Others  4
ZA  OthersAOthersnOthersdOthersrOthersoOthersiOthersdOthers 4
ZA  OthersMOthersaOtherscOthers 8
ZA  OthersWOthersiOthersnOthersdOthersoOtherswOtherssOthers 5

使用LENGTH()检查列值的长度。它 returns > 0,如果有其他值 return 0 表示空值或 NULL 值。

同时在 CASE WHEN ... END

中框出列值

最终查询可能如下所示:

SELECT country, CASE WHEN LENGTH(os(agent)) > 0 THEN os(agent) ELSE 'Others' END AS SO, COUNT(*) 
FROM clicks_data 
WHERE country IS NOT NULL AND os(agent) IS NOT NULL 
GROUP BY country, os(agent);

希望对你有帮助!!!

COALESCE 将是最适合您的案例的最佳解决方案

语法: COALESCE(VALUE,DEFAULT_VALUE): 函数 returns 默认值为 null else VALUE;

查询

SELECT country, COALESCE(os(agent),'Others') AS SO, COUNT(*) 
FROM clicks_data 
WHERE country IS NOT NULL AND os(agent) IS NOT NULL 
GROUP BY country, os(agent);

希望这是解决您问题的有效方法。

另一种可能的解决方案。如果您想在导出数据时简单地将所有 NULL 值替换为空字符串,您可以通过将 sed 命令输入 sql

的输出来实现
$ hive -e 'set hive.cli.print.header=true; select * from db_name.table_name;' | sed 's/[\t]/,/g; s/^NULL,/,/g; s/,NULL,/,,/g; s/,NULL$/,/g;' > test.csv

Credit

='' 也许是最简单的方法。 例如

CASE WHEN col='' THEN xxx ELSE yyy END 
     AS col_new;

对于有类似问题的人,我想在这里总结一下。

嗯,这是一个比较老的问题。提供的 SQL 过滤掉 NULL,因此您只需要处理空字符串 ""。但这与标题冲突,标题明确表示应考虑 NULL 和空字符串。所以我会坚持标题。

COALESCENVL只对NULL有效,对空字符串""无效。

LENGTH!=""(以及 CASE WHEN)都是可行的,因为它们与 NULL"" 兼容。请注意,当 = 操作的参数之一是 NULL 时,它的计算结果为 NULL

还有一点要注意,GROUP BY子句中的表达式要与SELECT子句中的表达式一致。我的意思是,当你 SELECTCASE WHEN... 这样的表达式时,你应该 GROUP BY 相同的表达式 CASE WHEN

这会导致代码重复,可以通过位置别名改善(0.11.0 版本后可能)。所以最终的查询可能是这样的:

--Only needed for version 0.11 through 2.1.x. 
SET hive.groupby.orderby.position.alias = true;  

SELECT
    country, 
    CASE 
        WHEN os(agent)!="" THEN os(agent)  --This also implies that it's not NULL.
        ELSE 'Others' 
    END AS SO, 
    COUNT(*) 
FROM clicks_data 
WHERE country IS NOT NULL 
GROUP BY 
    1, 2
;