6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

HiveのARRAY、STRUCT型とNULLと空配列と

Last updated at Posted at 2022-12-16

はじめに

クエリエンジンとして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と上手く付き合っていきましょう。

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?