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

时间:2015-05-17 09:03:46

标签: hadoop replace null hive

我试图显示默认值"其他",当查询未返回所选列之一的任何结果时。我将向您展示这个例子。

此查询返回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

5 个答案:

答案 0 :(得分:14)

使用LENGTH()检查列值的长度。它返回> 0,如果有一些值,则返回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);

希望这能帮到你!!!

答案 1 :(得分:10)

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

<强>语法: COALESCE(VALUE,DEFAULT_VALUE):当值为null时,函数返回默认值,否则为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);

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

答案 2 :(得分:1)

=''可能是最简单的方法。 例如

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

答案 3 :(得分:0)

另一种可能的解决方案。如果在导出数据时只想用空字符串替换所有NULL值,则可以通过向df <- fread(' Person_ID Department Date 351581 GH 12/1/2019 351581 GH 12/2/2019 351581 GH 12/3/2019 351581 FR 12/2/2019 598168 GH 12/16/2019 351581 JE 12/8/2019 351581 JE 12/9/2019 615418 AB 12/20/2019 615418 AB 12/22/2019 ') 命令输入sql输出

sed

Credit

答案 4 :(得分:0)

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

嗯,这是一个相对较老的问题。提供的SQL过滤掉了<h2>STREAMING</h2>,因此您只需要处理空字符串"_source" : { "group_words" : [ { "amount" : 1140, "words" : [ { "relevance_score" : 56, "points" : 66461, "bits" : 100, "word_combination" : "cat dog" }, { "relevance_score" : 84, "points" : 45202, "bits" : 990, "word_combination" : "cat dog elephant" }, { "relevance_score" : 99, "points" : 30974, "bits" : 70, "word_combination" : "elephant cat mouse leopard" } ], "group" : "whatever" }, { "amount" : 1320, "words" : [ { "relevance_score" : 25, "points" : 53396, "bits" : 70, "word_combination" : "lion elephant" }, { "relevance_score" : 66, "points" : 52166, "bits" : 20, "word_combination" : "lion mouse fish cat dog" }, { "relevance_score" : 82, "points" : 49316, "bits" : 810, "word_combination" : "elephant cat mouse leopard dog lion" }, { "relevance_score" : 87, "points" : 127705, "bits" : 290, "word_combination" : "elephant cat mouse leopard tiger lion" } ], "group" : "whatever" }, { "amount" : 11260, "words" : [ { "relevance_score" : 0, "points" : 37909, "bits" : 9000, "word_combination" : "elephant cat mouse leopard tiger lion monkey" }, { "relevance_score" : 3, "points" : 35782, "bits" : 540, "word_combination" : "elephant" } ], "group" : "whatever" } ] 。但这与标题冲突,标题明确指出NULL和空字符串都应考虑。所以我会坚持标题。

""NULL仅适用于COALESCE,但不适用于空字符串NVL

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

还要注意的另一件事是,我们应使NULL子句中的表达式与NULL子句中的表达式一致。我的意思是,当您GROUP BY这样的表达式SELECT时,您应该SELECT使用相同的表达式CASE WHEN...

这会导致代码重复,可以通过位置别名(自0.11.0版开始)进行改进。因此,最终查询可能是这样的:

GROUP BY