Amazon AthenaのIcebergテーブルのメタデータと使い所
データ事業本部の鈴木です。
Icebergテーブルはさまざまなエンジンから利用できる特徴から、とても注目されていますが、Amazon Athenaでも以前から利用可能です。
例えばタイムトラベル機能を利用する際、メタデータを確認することでどのタイミングでどのスナップショットだったかなどを簡単に確認でき、メタデータの確認方法を知っているととても便利です。今回は現時点でAthenaのIcebergテーブルが提供しているメタデータ情報を確認しました。
Athenaでクエリできるメタデータ
現状、以下のテーブルメタデータを簡単にAthenaからクエリできるようになっています。
$files
:現在のデータファイルを表示$manifests
:現在のマニフェスト情報を表示$history
:テーブルの履歴を表示$partitions
:現在のパーティションを表示$snapshots
:スナップショットを表示$refs
:リファレンスを表示
なお、メタデータはS3上のデータファイルのパスやマニフェストファイルの内容を簡易的に見られるようになっており、S3上のファイルを確認することで同様のデータを確認できます。
メタデータの詳細はIceberg Table Specを確認することをおすすめします。
メタデータを確認してみる
テーブルの準備
Icebergテーブルを作成するため、まずはS3バケットに配置したUCI Machine Learning RepositoryのIris Data Setを検索できるHive形式のirisテーブルを作成しておきました。
このデータセットは、下記リンクにて公開されています。
以下のように、CTASでiris_iceberg_parquet
テーブルを作成しました。このテーブルはIcebergテーブルとなっています。S3バケット名
は自身のものに読み替えてください。
CREATE TABLE iris_iceberg_parquet
WITH (table_type = 'ICEBERG',
format = 'PARQUET',
location = 's3://S3バケット名/iris_iceberg_parquet/',
is_external = false,
partitioning = ARRAY['species']
)
AS SELECT * FROM iris;
メタデータが分かりやすいよう、一度UPDATEしておきました。
UPDATE iris_iceberg_parquet SET sepal_length=10 WHERE species='setosa';
S3上は以下のファイルができています。
$filesの確認
データファイルを確認できます。setosaのファイルについてはUPDATEを実行しているので2つデータファイルがあり、合計4つのデータファイルが表示されます。
content | file_path | file_format | record_count | file_size_in_bytes | column_sizes | value_counts | null_value_counts | nan_value_counts | lower_bounds | upper_bounds | key_metadata | split_offsets | equality_ids |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | s3://バケット名/iris_iceberg_parquet/data/O7O7nQ/species=setosa/20250224_063916_00007_zauy9-38e05c25-cce4-4e7e-bf55-92077cc3a4bd.parquet | PARQUET | 50 | 1253 | {1=72, 2=161, 3=142, 4=117, 5=74} | {1=50, 2=50, 3=50, 4=50, 5=50} | {1=0, 2=0, 3=0, 4=0, 5=0} | {} | {1=10.0, 2=2.3, 3=1.0, 4=0.1, 5=setosa} | {1=10.0, 2=4.4, 3=1.9, 4=0.6, 5=setosa} | |||
0 | s3://バケット名/iris_iceberg_parquet/data/8DvMjQ/species=setosa/20250224_063847_00107_28j7d-0221f6f4-0a22-4cb7-94f8-b525cd335cee.parquet | PARQUET | 50 | 1341 | {1=159, 2=161, 3=142, 4=117, 5=74} | {1=50, 2=50, 3=50, 4=50, 5=50} | {1=0, 2=0, 3=0, 4=0, 5=0} | {} | {1=4.3, 2=2.3, 3=1.0, 4=0.1, 5=setosa} | {1=5.8, 2=4.4, 3=1.9, 4=0.6, 5=setosa} | |||
0 | s3://バケット名/iris_iceberg_parquet/data/xFTtNA/species=versicolor/20250224_063847_00107_28j7d-67fc3315-1501-402c-a49c-b7feb9bd259b.parquet | PARQUET | 50 | 1438 | {1=184, 2=154, 3=181, 4=137, 5=78} | {1=50, 2=50, 3=50, 4=50, 5=50} | {1=0, 2=0, 3=0, 4=0, 5=0} | {} | {1=4.9, 2=2.0, 3=3.0, 4=1.0, 5=versicolor} | {1=7.0, 2=3.4, 3=5.1, 4=1.8, 5=versicolor} | |||
0 | s3://バケット名/iris_iceberg_parquet/data/kk_EyA/species=virginica/20250224_063847_00107_28j7d-524a699d-9f6a-4ee0-b609-d2368b450217.parquet | PARQUET | 50 | 1458 | {1=184, 2=153, 3=187, 4=157, 5=77} | {1=50, 2=50, 3=50, 4=50, 5=50} | {1=0, 2=0, 3=0, 4=0, 5=0} | {} | {1=4.9, 2=2.2, 3=4.5, 4=1.4, 5=virginica} | {1=7.9, 2=3.8, 3=6.9, 4=2.5, 5=virginica} |
$manifestsの確認
マニフェストの確認ができます。CTASの後1度UPDATEを実行しているため、2つのスナップショット分が確認できました。
path | length | partition_spec_id | added_snapshot_id | added_data_files_count | added_rows_count | existing_data_files_count | existing_rows_count | deleted_data_files_count | deleted_rows_count | partitions |
---|---|---|---|---|---|---|---|---|---|---|
s3://バケット名/iris_iceberg_parquet/metadata/2e2dbeec-338f-4350-b80b-76a969f5c767-m0.avro | 7186 | 0 | 8126222933637037281 | 1 | 50 | 0 | 0 | 0 | 0 | [{contains_null=false, contains_nan=false, lower_bound=setosa, upper_bound=setosa}] |
s3://バケット名/iris_iceberg_parquet/metadata/694b704a-d40a-440a-9bad-f3f99e684e05-m0.avro | 7418 | 0 | 460470992577200672 | 3 | 150 | 0 | 0 | 0 | 0 | [{contains_null=false, contains_nan=false, lower_bound=setosa, upper_bound=virginica}] |
s3://バケット名/iris_iceberg_parquet/metadata/2e2dbeec-338f-4350-b80b-76a969f5c767-m1.avro | 7198 | 0 | 8126222933637037281 | 1 | 50 | 0 | 0 | 0 | 0 | [{contains_null=false, contains_nan=false, lower_bound=setosa, upper_bound=setosa}] |
$historyの確認
スナップショットの履歴が確認できました。こちらも2つのスナップショットが分かります。
made_current_at | snapshot_id | parent_id | is_current_ancestor |
---|---|---|---|
2025-02-24 06:38:49.626 UTC | 460470992577200672 | TRUE | |
2025-02-24 06:39:19.465 UTC | 8126222933637037281 | 460470992577200672 | TRUE |
$partitionsの確認
パーティションごとのレコード数・データファイルの数などが確認できました。削除されたデータの分も合わせて表示されるようです。
partition | record_count | file_count | total_size | data |
---|---|---|---|---|
{species=virginica} | 50 | 1 | 1458 | {sepal_length={min=4.9, max=7.9, null_count=0, nan_count=null}, sepal_width={min=2.2, max=3.8, null_count=0, nan_count=null}, petal_length={min=4.5, max=6.9, null_count=0, nan_count=null}, petal_width={min=1.4, max=2.5, null_count=0, nan_count=null}} |
{species=setosa} | 100 | 2 | 2594 | {sepal_length={min=4.3, max=10.0, null_count=0, nan_count=null}, sepal_width={min=2.3, max=4.4, null_count=0, nan_count=null}, petal_length={min=1.0, max=1.9, null_count=0, nan_count=null}, petal_width={min=0.1, max=0.6, null_count=0, nan_count=null}} |
{species=versicolor} | 50 | 1 | 1438 | {sepal_length={min=4.9, max=7.0, null_count=0, nan_count=null}, sepal_width={min=2.0, max=3.4, null_count=0, nan_count=null}, petal_length={min=3.0, max=5.1, null_count=0, nan_count=null}, petal_width={min=1.0, max=1.8, null_count=0, nan_count=null}} |
$snapshotsの確認
スナップショットの詳細が確認できます。オペレーションがなんだったかや、削除ファイルとして追加された削除位置の情報など細かい内容を確認できます。レコード削除の推移を見たい場合などはこの情報をみるのがよさそうです。
committed_at | snapshot_id | parent_id | operation | manifest_list | summary |
---|---|---|---|---|---|
2025-02-24 06:38:49.626 UTC | 460470992577200672 | append | s3://バケット名/iris_iceberg_parquet/metadata/snap-460470992577200672-1-694b704a-d40a-440a-9bad-f3f99e684e05.avro | {changed-partition-count=3, added-data-files=3, total-equality-deletes=0, added-records=150, trino_query_id=20250224_063847_00107_28j7d, total-position-deletes=0, added-files-size=4237, total-delete-files=0, total-files-size=4237, total-records=150, total-data-files=3} | |
2025-02-24 06:39:19.465 UTC | 8126222933637037281 | 460470992577200672 | overwrite | s3://バケット名/iris_iceberg_parquet/metadata/snap-8126222933637037281-1-2e2dbeec-338f-4350-b80b-76a969f5c767.avro | {added-data-files=1, added-position-deletes=50, total-equality-deletes=0, added-records=50, trino_query_id=20250224_063916_00007_zauy9, added-position-delete-files=1, added-delete-files=1, total-records=200, changed-partition-count=1, total-position-deletes=50, added-files-size=2424, total-delete-files=1, total-files-size=6661, total-data-files=4} |
$refsの確認
ブランチの情報を確認できます。ただし記事執筆時点ではAmazon Athenaではブランチはまだ対応していないようだったので、Icebergとしてそのような機能があるということを知っておく程度でよさそうです。
name | type | snapshot_id | max_reference_age_in_ms | min_snapshots_to_keep | max_snapshot_age_in_ms |
---|---|---|---|---|---|
main | BRANCH | 8126222933637037281 |
メタデータの使い所
タイムトラベルで確認したいスナップショットを調べるには$history
などが使えます。
また、オペレーションの種類や追加されたファイル数を確認するには$snapshots
が便利です。パーティションが細かく分かれているようなケースで、S3のAPI料金が高く付くようなケースは、具体的にどれくらいのファイルが日々追加されているのか確認するために使えます。
$partitions
も各パーティションに何ファイル・何レコードあるのか確認できます。
最後に
Amazon AthenaのIcebergテーブルのメタデータについて紹介しました。参考になりましたら幸いです。