0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MAP型のカラムを持つGlueテーブルに対して、Athenaでインサートしようとしたら詰まった話

Posted at

はじめに

最近、Athenaを使った集計基盤の構築を担当しています。
その集計処理の中で、MAP型を使う際にハマったので記録として残しておきます。

MAP型とは

公式ドキュメントより、

キーを使用して値を検索できるマップです。すべてのキーに同じ値が必要であり、すべての値に同じ値が必要です。

とのことです。
具体的には { hoge=1, huga=2 } みたいな形式です。

はまった事象

INSERT INTO...SELECT 構文を使用し、glueテーブル1のデータを基に集計処理を行い、glueテーブル2にinsertするという処理を実装していました。
glueテーブル2にはmap型のカラムが存在しています。具体的には以下のような感じです。

スクリーンショット 2024-06-04 17.14.13.png

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> となっていたので、念の為半角スペースを消してみたからです。
正直スルーしてもおかしくなかったし、解決したのは奇跡です。

最後に

どなたかの助けになれば幸いです。

...誰がわかるねんこれ。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?