将 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
=''
也许是最简单的方法。
例如
CASE WHEN col='' THEN xxx ELSE yyy END
AS col_new;
对于有类似问题的人,我想在这里总结一下。
嗯,这是一个比较老的问题。提供的 SQL 过滤掉 NULL
,因此您只需要处理空字符串 ""
。但这与标题冲突,标题明确表示应考虑 NULL
和空字符串。所以我会坚持标题。
COALESCE
和NVL
只对NULL
有效,对空字符串""
无效。
LENGTH
和 !=""
(以及 CASE WHEN
)都是可行的,因为它们与 NULL
和 ""
兼容。请注意,当 =
操作的参数之一是 NULL
时,它的计算结果为 NULL
。
还有一点要注意,GROUP BY
子句中的表达式要与SELECT
子句中的表达式一致。我的意思是,当你 SELECT
像 CASE 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
;
我正在尝试显示默认值 "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
=''
也许是最简单的方法。
例如
CASE WHEN col='' THEN xxx ELSE yyy END
AS col_new;
对于有类似问题的人,我想在这里总结一下。
嗯,这是一个比较老的问题。提供的 SQL 过滤掉 NULL
,因此您只需要处理空字符串 ""
。但这与标题冲突,标题明确表示应考虑 NULL
和空字符串。所以我会坚持标题。
COALESCE
和NVL
只对NULL
有效,对空字符串""
无效。
LENGTH
和 !=""
(以及 CASE WHEN
)都是可行的,因为它们与 NULL
和 ""
兼容。请注意,当 =
操作的参数之一是 NULL
时,它的计算结果为 NULL
。
还有一点要注意,GROUP BY
子句中的表达式要与SELECT
子句中的表达式一致。我的意思是,当你 SELECT
像 CASE 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
;