はじめに
クエリエンジンとしてHiveを使用しています。
テストデータ作成等でARRAY、STRUCTなどのComplex型をNULLにしたいとき、そしてSTRUCT型のARRAYを空にしたいときのTips記事です。
結論
- ARRAY、STRUCT型などのComplex型をNULLにするときはIF関数が使えます。
- STRUCT型のARRAYを空にしたいときはIF関数とCOLLECT_LISTの組み合わせが使えます。
Complex型をNULLにするとき
弊社のエンジニアブログで既に紹介されています。
https://developers.microad.co.jp/entry/2018/10/19/170001
具体的には以下のように書けます。
INSERT INTO example_table SELECT 1, IF(FALSE, NAMED_STRUCT('field', 1), NULL), IF(FALSE, ARRAY(2), NULL);
STRUCT型のARRAYを空にしたいとき
今回メインで書きたかったのはこちらです。
検索してみると、例えば以下のような解決方法が提案されていました。
select a.id, collect_list(b.str) my_array
from
(select 2 id ) a
left join (select 1 as id, named_struct('name',null,'value',null) as str) b
on a.id=b.id
group by a.id
https://stackoverflow.com/questions/56016700/how-to-create-an-empty-array-of-struct-in-hive より抜粋
こんなに大変なのか...と思ったのですが、前述したComplex型をNULLにする方法とCOLLECT_LISTを組み合わせることで簡単になりました。
具体的には以下のように書けます。
INSERT INTO example_table SELECT COLLECT_LIST(IF(FALSE, NAMED_STRUCT('field', 1), NULL));
NULLとして認識されているSTRUCT型を配列にするだけです。
まとめ
HiveのARRAY、STRUCTなどのComplex型に関するTipsでした。
皆さまもHiveと上手く付き合っていきましょう。