はじめに
最近、Athenaを使った集計基盤の構築を担当しています。
その集計処理の中で、MAP型を使う際にハマったので記録として残しておきます。
MAP型とは
公式ドキュメントより、
キーを使用して値を検索できるマップです。すべてのキーに同じ値が必要であり、すべての値に同じ値が必要です。
とのことです。
具体的には { hoge=1, huga=2 }
みたいな形式です。
はまった事象
INSERT INTO...SELECT
構文を使用し、glueテーブル1のデータを基に集計処理を行い、glueテーブル2にinsertするという処理を実装していました。
glueテーブル2にはmap型のカラムが存在しています。具体的には以下のような感じです。
MAP型のカラムに対しては map_agg
と言う関数を用いて作成された値を入れようとしていました。
そして、INSERT INTO...SELECT
しようとしたら、以下のようなエラーになりました。
HIVE_INVALID_METADATA: Glue table 'xxx' column 'test' has invalid data type: map<string, float>
解決策
結論から言うと、map<string, float>
を map<string,float>
に変更したらいけました。
,
の後に半角スペースがあるのはダメみたいです。
厄介なのは、以下の二点です。
- マネジメントコンソールでglueのテーブル定義を見ると、
,
の後に半角スペースがあろうがなかろうがちゃんとMAP型として解釈されていること- しかも、普通に見るだけではどちらも同じ型のように見えること
- そして、なぜか半角スペースがあるかないかで挙動が変わること
- 2024/06/04現在、この記事の「MAP型とは」のセクションであげた公式ドキュメント には
MAP<key_type, value_type>
のように半角スペースが含まれていること
僕がこれに気づけた理由は、試しにCREATE TABLE AS SELECT(通称CTAS)
して自動で作られたテーブル定義を見たらmap<string,float>
となっていたので、念の為半角スペースを消してみたからです。
正直スルーしてもおかしくなかったし、解決したのは奇跡です。
最後に
どなたかの助けになれば幸いです。
...誰がわかるねんこれ。