はじめに
当記事を開いていただきありがとうございます。電通総研 エンジニアリングオフィスの徳山です。
この記事は、テーブルフォーマットの Iceberg についての初歩的な内容を説明します。
BigQuery で Iceberg 形式のデータを作成し、実体ファイルの中身をお見せすることで、Iceberg が一体どういうものなのか実感を持つきっかけになればと意図しています。
ただし、タイトルのとおり期待どおりにはいきませんでした。私の事前調査不足でございます。
Iceberg とは?
Apache Iceberg は、分析向けに作られたフォーマットの1つで、テーブルフォーマットと呼ばれます。
データ分析基盤のデータレイクに格納するデータファイルのフォーマットに使用されます。
Iceberg などのテーブルフォーマットを使用して機能的に統合されたデータレイクはレイクハウスと呼ばれ、データウェアハウスやETLツールなどと組み合わせて相互補完的に使用されます。
データレイクへ格納されるデータファイルは、CSV などのファイルフォーマットや Parquet などのデータフォーマットで格納されます。さらにそれらデータファイルを Iceberg などのテーブルフォーマットが梱包するようにフォーマットし、様々な機能が加わります。
Iceberg (Apache Iceberg) を使用することで以下の機能がデータレイクで利用できるようになります。
- Schema evolution : スキーマの変更
- Hidden partitioning : Icebergの内部でパーティション値を生成・保持し、ユーザは意識せずに利用可能
- Partition layout evolution : パーティションの改変を実現
- Time travel : データのスナップショットを取得し、スキーマの変更の追跡やロールバックなどを実現
これらの機能はリレーショナルデータベースやデータウェアハウスなどではお馴染みのものに見えます。しかし、データレイクではデータはファイルで格納されるため、それらファイルをテーブルのようにスキーマ変更したりパーティションを組み替えたりできるようになることが画期的なものと理解しています。
Iceberg Table for BigQuery
Google Cloud の BigQuery は、Iceberg Table というBigQuery用のテーブルフォーマットとして Iceberg をサポートしています。
テーブル作成時に、 Iceberg 形式を指定し、データの格納先として Google Cloud Storage (GCS) のフォルダパスを指定することで Iceberg Table のテーブルが作成されます。
これは External Table (外部テーブル) に似ていますが、BigQueryにおいては、 External Table ではありません。
External Table とは、ストレージ上のデータファイルをデータウェアハウスなどからテーブルとしてフォーマットする技術です。クラウドサービスや Apache Spark 、Hive などで以前から存在し、データレイクに対して使用されてきました。
一般的に External Table はデータファイルを読み取ってテーブルのようにクエリすることはできますが、Iceberg のような機能はありません。
BigQuery には External Table と同類の機能で BigLake External table というテーブル形式があり、Iceberg 用の BigLake External Table が別途存在します。
Iceberg Table を作る
用意するもの
- Google Cloud Storage のバケットとフォルダ : Iceberg Tableのデータファイル格納先
- BigQuery のデータセット : BigQuery 側のテーブル
- BigQuery の外部接続 : BigQuery から Google Cloud Storage への接続で使用するサービスアカウント
テーブル作成
以下のクエリでテーブルを作成します。
# BigQueryのプロジェクトIDやデータセット名、カラムなどの記述を省略しています。 CREATE TABLE IF NOT EXISTS <プロジェクトIDやデータセット名>.call_center_iceberg ( PRIMARY KEY (cc_call_center_sk) NOT ENFORCED, cc_call_center_sk STRING NOT NULL, cc_call_center_id STRING NOT NULL, < カラムの指定省略 > cc_tax_percentage DECIMAL(7, 2), processing_date DATE, ingestion_date DATE ) CLUSTER BY processing_date WITH CONNECTION <外部接続ID> OPTIONS ( file_format = 'PARQUET', table_format = 'ICEBERG', storage_uri = 'gs://<GCSバケット名>/raw-data/store-sales-iceberg') ;
作成されたテーブル (Iceberg Table)
通常のテーブルスキーマのように見えます。通常のテーブルは "プレビュー" というタブが表示されますが、Icheberg Table の場合は表示されません。
テーブル作成時に指定のデータファイルの格納先フォルダ
metadata というフォルダが作成されて、中に json ファイルが入っています。
データを入れる
insert into を実行してデータを入れてみました。
テーブル (Iceberg Table) 側で見えるデータ
テーブル形式のデータのように見えます。
テーブル作成時に指定のデータファイルの格納先フォルダ
data というフォルダが作成されて、中に parquet フォーマットのファイルが入っており、これが BigQuery の画面へ表示のデータです。
Time Travelできないし、なんだかメタデータがめっちゃ少ない!!!
次にデータやスキーマを更新して Time Travel の機能を使ってスナップショットを見ていきたかったのですが、BigQuery の Iceberg Table では使えないことが分かりました。
そういえば、前述の metadata に格納された json にメタデータがほぼ記録されていないことに気づきました。
{ "properties": { "bigquery-table-id": "xxxxxx.xxxxxx.call_center_iceberg" }, "current-snapshot-id": -1 }
本来の Iceberg では、データやスキーマが更新されるとスナップショットが作成されて、この metadata.json へ記録されます。
BigQuery の Iceberg Table では更新しても metadata.json は特に変化がありませんでした。
次へ
Iceberg Table on BigQuery はまだプレビュー版のため今後に期待したいと思います。
その間、AWS や Databricks、Snowflake、DuckDBなどで Iceberg を使って深掘りしていきたいと思います。
ここまで読んでいただき本当にありがとうございました!!!
どうぞ良いお年をお迎えください。
執筆:@shikarashika、レビュー:@nagamatsu.yuji
(Shodoで執筆されました)