web-dev-qa-db-ja.com

空の値またはNULL値をHiveクエリ結果の特定の値に置き換えます

選択した列の1つに対してクエリが結果を返さない場合、デフォルト値「その他」を表示しようとしています。例を示します。

このクエリは、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()を使用して、列の値の長さを確認します。値がある場合は> 0を返し、それ以外の場合は空またはNULL値の場合は0を返します。

また、列値を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);

これがあなたを助けることを願っています!!!

14
Farooque

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);

これがあなたの問題の効率的な解決策になることを願っています。

10
Jignesh

=''おそらく最も簡単な方法です。例えば.

CASE WHEN col='' THEN xxx ELSE yyy END 
     AS col_new;
1
Sean.H

別の可能な解決策。データをエクスポートするときに、すべての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

クレジット

同様の問題を抱えている人のために、ここで要約したいと思います。

まあ、これは比較的古い質問です。提供されたSQLはNULLを除外するため、処理する必要があるのは空の文字列""だけです。ただし、これは、NULLと空の文字列の両方を考慮する必要があることを明確に示しているタイトルと競合します。タイトルにこだわります。

COALESCEおよびNVLNULLに対してのみ機能しますが、空の文字列""に対しては機能しません。

LENGTH!=""は、NULLCASE WHENと互換性があるため、両方とも""とともに使用できます。 =操作のパラメーターの1つがNULLである場合、NULLと評価されることに注意してください。

もう1つ注意すべき点は、GROUP BY句の式をSELECT句の式に準拠させる必要があることです。つまり、SELECTのような式をCASE WHEN...とすると、同じ式をGROUP BYCASE WHENする必要があります。

これによりコードの繰り返しが発生しますが、これはposition aliasで改善できます(バージョン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
;
0
gaccio