ITお絵かき修行

3歩歩いても忘れないために

Amazon ionフォーマットのデータをAthenaでクエリしてみた

Amazon ionとは

Ion は、Amazon 内部で独自に開発された、オープンソースでリッチタイプの自己記述型階層データシリアル化フォーマットです。Ion は、構造化データと非構造化データの両方を一緒に保存する抽象データモデルに基づいています。

・型指定できるJSONフォーマットという印象です。
 ・数値型の精度、timestampのタイムゾーンなど細かな指定が可能
 ・リスト、辞書、S式といったデータも格納可能
 ・型情報のアノテーションを付与可能で、処理時に型を検証させることが可能
 ・スキーマレス
Amazon QLDB での Amazon Ion データ形式リファレンス - Amazon Quantum Ledger Database (Amazon QLDB)
Amazon Athena が Amazon Ion データのクエリのサポートを追加

利用シーン

・QLDB等で利用されている台帳データをs3へ出力し、ionフォーマットで読み込みデータカタログ化した後、Athena等で解析可能とする 等
→監査ログなどの半構造化データとS3に保管されている他データとの活用が実施しやすくなる
f:id:hhhhhskw:20220417004802p:plain
f:id:hhhhhskw:20220417004632p:plain
https://pages.awscloud.com/rs/112-TZM-766/images/Session3%20-%20%E4%B8%80%E6%AD%A9%E8%B8%8F%E3%81%BF%E8%BE%BC%E3%82%93%E3%81%9F%E3%82%99Amazon%20QLDB%E3%81%AE%E5%88%A9%E7%94%A8%E6%96%B9%E6%B3%95.pdf

やってみた

・ionフォーマットのファイルを用意し、Glue CrawlerでGlueDataCatalogへデータカタログを作成したうえで、Athenaよりクエリ可能かを検証しました。
amzn.github.io

1.ionフォーマットのファイルを用意し、S3へ配置

 {data: annot::{foo: null.string, bar: ( 'a' 'b' 'c' )}, time: 2022-04-17T20:30Z}

f:id:hhhhhskw:20220417011504p:plain


2.1.のデータを読み込めるGlue Crawlerを作成しデータカタログを作成
・クロールさせたところ、DataCatalogは作成できましたが、入出力形式およびSerde シリアル化ライブラリの指定がされていなかったので手動で追加しました。
(左が変更前、右が変更後 ※上下中央辺りの項目を変更)
f:id:hhhhhskw:20220417010840p:plain

・struct型の中身もチェックしてくれますが、型や精度は正確でない場合がありました(体感)。
→fooカラムについて、値はnullですが型はStringとして認識されています。
f:id:hhhhhskw:20220417020640p:plain
Using CREATE TABLE to Create Amazon Ion Tables - Amazon Athena
Using a SerDe - Amazon Athena


3.Athenaよりクエリを実行し、結果を取得
f:id:hhhhhskw:20220417011719p:plain
・S式(sexp)型は、マネコンよりGlueDataCatalogへ指定できなかったので、未検証
・参考までにDDLを張っておきます。 ※データベース名、テーブル名は適当です

CREATE EXTERNAL TABLE `ion_tbl`(
  `data` struct<foo:string,bar:array<string>> COMMENT '', 
  `time` timestamp COMMENT '')
ROW FORMAT SERDE 
  'com.amazon.ionhiveserde.IonHiveSerDe' 
STORED AS INPUTFORMAT 
  'com.amazon.ionhiveserde.formats.IonInputFormat' 
OUTPUTFORMAT 
  'com.amazon.ionhiveserde.formats.IonOutputFormat'
LOCATION
  's3://[BucketName]/ion_db/ion_tbl/'
TBLPROPERTIES (
  'CrawlerSchemaDeserializerVersion'='1.0', 
  'CrawlerSchemaSerializerVersion'='1.0', 
  'UPDATED_BY_CRAWLER'='ion_test', 
  'averageRecordSize'='83', 
  'classification'='ion', 
  'compressionType'='none', 
  'objectCount'='1', 
  'recordCount'='1', 
  'sizeKey'='83', 
  'typeOfData'='file')

感想

・割とすんなり使えました。
・ionフォーマットの利点があまり見えてこないので、AWS社内事例なんかを聞いてみたいです。
→avro、parquet等のフォーマットではなくionである理由。 スキーマ情報は欲しいがカラムナフォーマットではなく、性能面で有利なフォーマット?

備考

・現在(2022/4/17時点)での検証結果です。
・GlueのDynamicFrameではionフォーマットは扱えないようです。
AWS Glue での ETL 入力および出力の形式オプション - AWS Glue
AWS DataWrangler等を使ってAthena越しにデータ参照するしかなさそうです。
Quick Start — AWS Data Wrangler 2.15.0 documentation
・Athenaでionフォーマットを扱えるようになったことで、QLDBのジャーナルデータをAthenaから変換無しでクエリできるようになったようです。
Amazon QLDBのジャーナルデータがJSONエクスポート出来るようになったので、QuickSightで集計してみた | DevelopersIO