Amazon AthenaのIcebergテーブルのメタデータと使い所

Amazon AthenaのIcebergテーブルのメタデータと使い所

Icebergテーブルのメタデータの具体例と、個人的に便利だった使い所について記載しました。
Clock Icon2025.02.25

データ事業本部の鈴木です。

Icebergテーブルはさまざまなエンジンから利用できる特徴から、とても注目されていますが、Amazon Athenaでも以前から利用可能です。

例えばタイムトラベル機能を利用する際、メタデータを確認することでどのタイミングでどのスナップショットだったかなどを簡単に確認でき、メタデータの確認方法を知っているととても便利です。今回は現時点でAthenaのIcebergテーブルが提供しているメタデータ情報を確認しました。

Athenaでクエリできるメタデータ

現状、以下のテーブルメタデータを簡単にAthenaからクエリできるようになっています。

  • $files:現在のデータファイルを表示
  • $manifests:現在のマニフェスト情報を表示
  • $history:テーブルの履歴を表示
  • $partitions:現在のパーティションを表示
  • $snapshots:スナップショットを表示
  • $refs:リファレンスを表示

https://docs.aws.amazon.com/athena/latest/ug/querying-iceberg-table-data.html

なお、メタデータはS3上のデータファイルのパスやマニフェストファイルの内容を簡易的に見られるようになっており、S3上のファイルを確認することで同様のデータを確認できます。

メタデータの詳細はIceberg Table Specを確認することをおすすめします。

https://iceberg.apache.org/spec/

メタデータを確認してみる

テーブルの準備

Icebergテーブルを作成するため、まずはS3バケットに配置したUCI Machine Learning RepositoryのIris Data Setを検索できるHive形式のirisテーブルを作成しておきました。

このデータセットは、下記リンクにて公開されています。

https://archive.ics.uci.edu/ml/datasets/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としてそのような機能があるということを知っておく程度でよさそうです。

https://iceberg.apache.org/docs/1.8.0/branching/#use-cases

name type snapshot_id max_reference_age_in_ms min_snapshots_to_keep max_snapshot_age_in_ms
main BRANCH 8126222933637037281

メタデータの使い所

タイムトラベルで確認したいスナップショットを調べるには$historyなどが使えます。

https://docs.aws.amazon.com/athena/latest/ug/querying-iceberg-time-travel-and-version-travel-queries.html

また、オペレーションの種類や追加されたファイル数を確認するには$snapshotsが便利です。パーティションが細かく分かれているようなケースで、S3のAPI料金が高く付くようなケースは、具体的にどれくらいのファイルが日々追加されているのか確認するために使えます。

$partitionsも各パーティションに何ファイル・何レコードあるのか確認できます。

最後に

Amazon AthenaのIcebergテーブルのメタデータについて紹介しました。参考になりましたら幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.