Snowflake における Apache Iceberg の機能の完全ガイド： Apache Iceberg on Snowflake 活用の第一歩

## 概要

本記事では、Snowflake 上で利用できる Apache Iceberg 機能について解説します。一般的に Apache Iceberg を利用する場合、Snowflake Open Catalog に注目が集まりがちですが、Snowflake カタログだけで処理を完結できる Snowflake Catalog が、多くのユースケースで利用される可能性が高いと考えています。本記事では、Snowflake における Apache Iceberg 機能全体を俯瞰できるようまとめました。

Snowflake で Apache Iceberg を検証する際は、Apache Spark などの外部サービスが必要になります。本記事では、より多くの方が利用できる Google Colab 上での実行方法を紹介します。

また、Apache Iceberg を活用したデータの相互運用に際して考慮すべきポイントを「利用時の注意点」として整理しています。各サービスごとに設計思想が異なるため、相互運用は簡単ではありません。しかし、単一のサービスですべてを賄うのが困難である以上、相互運用は今後ますます重要になると考えられます。ぜひ挑戦してみてください。

## Snowflake における Apache Iceberg 機能における Snowflake と Snowflake Open Catalog

Snowflake にて Apache Iceberg 機能を理解するには、Snowflake Catalog（Snowflake をカタログとして利用する方法）と Snowflake Open Catalog の関係性を把握することが重要です。また、Snowflake とは別の Snowflake アカウントで Snowflake Open Catalog を利用している点に注意が必要です。

---

Snowflake で Apache Iceberg 機能を利用するには、Snowflake を Iceberg カタログとして使用する方法と、外部カタログを使用する方法があります。外部カタログの一例が Snowflake Open Catalog です。外部カタログを利用する際は、Snowflake のオブジェクトであるカタログ統合（Catalog Integration）を用いて管理し、Snowflake Open Catalog のほか、AWS Glue や Apache Iceberg REST カタログなどもサポートされています。

1. SnowflakeをIcebergカタログとして使用する方法  
1. 外部カタログを使用する方法  
    1. Snowflake Open Catalog  
    1. AWS Glue Catalog  
    1. Apache Iceberg REST カタログ  
    1. オブジェクトストレージ  

---

Snowflake 上では、上記の 2 つのいずれの方法で管理されているかによって、Snowflake を Iceberg カタログとして使用するテーブルと、外部カタログを使用するテーブルの 2 種類があります。本記事では、前者を Snowflake 管理 Iceberg テーブル（Snowflake-managed Iceberg tables）、後者を 外部カタログ Iceberg テーブルと呼びます。また、これら 2 種類のテーブルを合わせて Iceberg テーブルと呼びます。

1. SnowflakeをIcebergカタログとして使用するテーブル  
1. 外部カタログを使用するテーブル  

---

話を移して、Snowflake Open Catalog では内部カタログと外部カタログに分けられます。これは Snowflake ではなく、Snowflake Open Catalog の観点での呼称です。内部カタログは Snowflake Open Catalog により管理されるカタログで、データの READ と WRITE がサポートされています。一方、外部カタログは Snowflake Open Catalog 以外の Apache Iceberg カタログ（例：AWS Glue や Dremio Arctic）で管理されるテーブルを同期するカタログであり、データの READ のみがサポートされます。Snowflake Catalog（Snowflake をカタログとして利用する方法）は、 Snowflake Open Catalog ににとっては外部カタログの一つです。

1. 内部カタログ  
1. 外部カタログ
    1. Snowflake Catalog
    1. AWS Glue
    1. Dremio Arctic

---

Snowflake と Snowflake Open Catalog は独立したサービスのため、それぞれの視点で名称が異なります。Snowflake の視点では、Snowflake Open Catalog は外部カタログとなり、そのテーブルは外部カタログ Iceberg テーブルとして扱われます。一方、Snowflake Open Catalog の視点では、Snowflake は外部カタログにあたるため、Snowflake Open Catalog 経由でそのテーブルに対して WRITE を実行することはできません。

以上が、Snowflake にて Apache Iceberg 機能を利用する方法の全体像です。調査当初は Snowflake と Snowflake Open Catalog の関係性について混乱することがよくありましたが、改めてこの章を読み返し、両者の関係をイメージすることが重要です。

## Apache Iceberg 機能における Snowflake

### Snowflake Catalog とは

前述の通り、Snowflake で Apache Iceberg 機能を利用するには、Snowflake を Iceberg カタログとして使用する方法と、外部カタログを使用する方法があります。Iceberg テーブルを作成するには、そのカタログと外部 Volume を利用します。外部 Volume はデータ配置されているストレージの接続先と認証情報を保持しています。
1. SnowflakeをIcebergカタログとして使用する方法  
2. 外部カタログを使用する方法  

SnowflakeをIcebergカタログとして使用する方法では、必要なオブジェクトは Snowflake と外部のストレージです。Iceberg テーブルのカタログの機能（主に最新の metadata file のパスの保持）を Snowflake にて実施して、Iceberg テーブルのデータを外部のクラウドストレージにて保持します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/2b4ccf06-c15d-443b-b376-57d35921d295.png)

出所：[Apache Iceberg™ テーブル | Snowflake Documentation](https://docs.snowflake.com/ja/user-guide/tables-iceberg)

外部カタログを使用する方法 では、必要なオブジェクトは Snowflake 、外部のストレージ、および、Apache Iceberg カタログです。Iceberg テーブルのカタログの機能をApache Iceberg カタログで実施して、 Snowflake ではその情報を同期（Snowflake ではリフレッシュと呼ばれる処理）を実施します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e4b38b77-f0dd-4fae-b691-823bad166c90.png)

出所：[Apache Iceberg™ テーブル | Snowflake Documentation](https://docs.snowflake.com/ja/user-guide/tables-iceberg)

Iceberg テーブルを利用する際の最初のステップは、カタログの選択です。Snowflake をカタログとして使用する場合は構成済みのため省略できますが、外部カタログを使用する場合は「カタログ統合（Catalog Integration）」というオブジェクトを作成します。Snowflake Open Catalog や AWS Glue など、利用する外部カタログごとに作成手順や設定項目が異なるため、詳細は各ドキュメントを参照してください。

- [AWS Glueのカタログ統合を設定する](https://docs.snowflake.com/ja/user-guide/tables-iceberg-configure-catalog-integration-glue)
- [オブジェクトストレージ内のファイルに対してカタログ統合を構成する](https://docs.snowflake.com/ja/user-guide/tables-iceberg-configure-catalog-integration-object-storage)
- [Snowflake Open Catalog のカタログ統合を設定する](https://docs.snowflake.com/ja/user-guide/tables-iceberg-configure-catalog-integration-open-catalog)
- [Apache Iceberg™ REST カタログのカタログ統合を構成する](https://docs.snowflake.com/ja/user-guide/tables-iceberg-configure-catalog-integration-rest)

次に外部 Volume を作成します。外部 Volume の作成手順はクラウドベンダーごとに異なり、Snowflake ドキュメントに詳細が紹介されています。

- [Amazon S3](https://docs.snowflake.com/ja/user-guide/tables-iceberg-configure-external-volume-s3)
- [Google Cloud Storage](https://docs.snowflake.com/ja/user-guide/tables-iceberg-configure-external-volume-gcs)
- [Azure Storage](https://docs.snowflake.com/ja/user-guide/tables-iceberg-configure-external-volume-azure)

最後にテーブルを作成します。どのカタログを利用するかによって、作成方法が異なるのでドキュメントを確認してください。パラメータの設定項目もカタログごとに差異がありますが、Snowflake を Iceberg カタログとして使用するテーブルが最も機能が充実しています。

- **SnowflakeをIcebergカタログとして使用するテーブル**  
  - [CREATE ICEBERG TABLE （IcebergカタログとしてのSnowflake）](https://docs.snowflake.com/ja/sql-reference/sql/create-iceberg-table-snowflake)
- **外部カタログを使用するテーブル**  
  - [CREATE ICEBERG TABLE （Icebergカタログとしての AWS Glue）](https://docs.snowflake.com/ja/sql-reference/sql/create-iceberg-table-aws-glue)
  - [CREATE ICEBERG TABLE （オブジェクトストレージ内のIcebergファイル）](https://docs.snowflake.com/ja/sql-reference/sql/create-iceberg-table-iceberg-files)
  - [CREATE ICEBERG TABLE （オブジェクトストレージ内のDeltaファイル）](https://docs.snowflake.com/ja/sql-reference/sql/create-iceberg-table-delta)
  - [CREATE ICEBERG TABLE (REST または Snowflake Open Catalog)](https://docs.snowflake.com/ja/sql-reference/sql/create-iceberg-table-rest)

### 外部カタログを使用するテーブルにおけるリフレッシュ

外部カタログを使用するテーブルでは、メタデータを更新する「リフレッシュ」が必要です。リフレッシュには自動実行と手動実行の 2 種類があります。自動リフレッシュには Snowpipe のコストがかかるため、要件に合わせて手動と自動のどちらを使うか検討することをおすすめします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b4ccfdb3-5cb9-4f66-8072-02a1c1daeb63.png)
出所：[Automatically refresh Apache Iceberg™ tables | Snowflake Documentation](https://docs.snowflake.com/en/user-guide/tables-iceberg-auto-refresh)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/70fa3d63-fc49-49ab-ad51-18864a965922.png)
出所：[ALTER ICEBERG TABLE | Snowflake Documentation](https://docs.snowflake.com/ja/sql-reference/sql/alter-iceberg-table)

### Snowflake Catalog SDK

Snowflake Catalog の Iceberg テーブルへ外部サービスからアクセスする場合、Snowflake Catalog SDK を利用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d1e988db-871d-4e6e-bad4-febb4915d1c8.png)
出所：[Snowflakeカタログ SDK | Snowflake Documentation](https://docs.snowflake.com/ja/user-guide/tables-iceberg-catalog)

Snowflake Catalog SDK は Snowflake に JDBC 接続してメタデータを取得し、Apache Spark などの外部サービスからストレージ上のデータを参照するしくみです。テーブルのデータを取得する場合に SYSTEM$GET_ICEBERG_TABLE_INFORMATION 関数により metadata file のパスを取得するため、クラスターが起動するようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0f96f347-b3a1-4eb1-9235-87006c79f7ea.png)
出所：[Snowflakeカタログ SDK | Snowflake Documentation](https://docs.snowflake.com/ja/user-guide/tables-iceberg-catalog)

具体的な手順は、後述の「Snowflake Catalog における Iceberg テーブルの基本的な操作手順」で紹介しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/4039ff20-7c72-46aa-9066-cf849cbae306.png)
出所：[Snowflake Catalog における Iceberg テーブルの基本的な操作手順 - Qiita](https://qiita.com/manabian/items/69761bde791d0f014246#snowflake-catalog-sdk-により-spark-から接続)

### データアクセスポリシー

Snowflake 管理 Iceberg テーブル（SnowflakeをIcebergカタログとして使用するテーブル）の `CREATE ICEBERG TABLE` 文では、`ROW ACCESS POLICY` と `MASKING POLICY` のデータアクセスポリシーをサポートしていることを確認しました。サポート内容の詳細は、各種ドキュメント内の `CREATE ICEBERG TABLE` 文を参照してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/203c48b3-a8ab-40f2-a6df-1cdefc781a01.png)
出所：[CREATE ICEBERG TABLE （IcebergカタログとしてのSnowflake） | Snowflake Documentation](https://docs.snowflake.com/ja/sql-reference/sql/create-iceberg-table-snowflake#syntax)

### Snowflake 管理 Iceberg テーブルを Snowflake Open Catalog への自動同期

Snowflake 管理 Iceberg テーブル（SnowflakeをIcebergカタログとして使用するテーブル）は、Snowflake Open Catalog に対して自動同期できます。`CREATE ICEBERG TABLE` および `ALTER ICEBERG TABLE` 文で `CATALOG_SYNC` オプションを指定すると、Snowflake Catalog で管理されている Iceberg テーブルを Snowflake Open Catalog へ外部カタログとして登録できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f75d9f43-f361-46c4-a6be-c7b9b2a15e0b.png)
出所：[CREATE ICEBERG TABLE （IcebergカタログとしてのSnowflake） | Snowflake Documentation](https://docs.snowflake.com/ja/sql-reference/sql/create-iceberg-table-snowflake#syntax)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a0300211-2df4-4f90-8b59-c1ebcc676a99.png)
出所：[ALTER ICEBERG TABLE | Snowflake Documentation](https://docs.snowflake.com/ja/sql-reference/sql/alter-iceberg-table)

## Snowflake Open Catalog

### Snowflake Open Catalog とは

Snowflake Open Catalog は、Snowflake が提供する Apache Polaris のマネージドサービスです。Snowflake Catalog とはアカウントが分離されており、独立したサービスとして提供されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d43dad05-4b8d-4e74-854f-b0daf5da36d1.png)
引用元：[Snowflake Open Catalog overview | Snowflake Documentation](https://other-docs.snowflake.com/en/opencatalog/overview)

Snowflake Open Catalog を利用開始するには、Snowflake Open Catalog が有効な Snowflake アカウントを作成する必要があります。アカウント作成方法には Snowsight を使った GUI での作成と、Snowflake SQL を使った方法があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/34a501fb-4f0a-43c0-b679-6b2a7c3b7e61.png)
出所：[Snowsightを使用したアカウントの作成 | Snowflake Documentation](https://other-docs.snowflake.com/ja/opencatalog/create-open-catalog-account#create-an-account-by-using-snowsight)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a39ffd87-0d9d-48b8-8400-f2c4b94d25d7.png)
出所：[Snowflake SQL を使用したアカウントの作成 | Snowflake Documentation](https://other-docs.snowflake.com/ja/opencatalog/create-open-catalog-account#create-an-account-by-using-snowflake-sql)

外部サービスから Snowflake Open Catalog のテーブルにアクセスする場合は、プリンシパル・ロール、サービス接続、カタログ・ロールを作成し、サービス接続が属するプリンシパル・ロールにカタログ・ロールの権限を付与する必要があります。詳細手順は後述の「Snowflake Open Catalog における Iceberg テーブルの基本的な操作手順」で紹介しています。

- [プリンシパル・ロールの作成 | Snowflake Documentation](https://other-docs.snowflake.com/ja/opencatalog/create-principal-role)
- [サービス接続の設定と削除 | Snowflake Documentation](https://other-docs.snowflake.com/ja/opencatalog/configure-service-connection)
- [カタログ・ロールの作成 | Snowflake Documentation](https://other-docs.snowflake.com/ja/opencatalog/create-catalog-role)

### Snowflake Open Catalog から Snowflake Catalog への同期

Snowflake Open Catalog から Snowflake Catalog への自動同期はサポートされていません。Snowflake で Snowflake Open Catalog のカタログ統合を作成し、Iceberg REST カタログ経由で `CREATE ICEBERG TABLE` を実行することで、Snowflake Catalog 側にテーブルを登録する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/436b0bb1-ae46-4f6b-8100-57b5263abeaa.png)
出所：[Snowflake Open Catalog のカタログ統合を設定する | Snowflake Documentation](https://docs.snowflake.com/ja/user-guide/tables-iceberg-configure-catalog-integration-open-catalog)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0a015644-0901-4d8a-b34d-ff60d6315ed6.png)
出所：[CREATE ICEBERG TABLE (Iceberg REST カタログ) | Snowflake Documentation](https://docs.snowflake.com/ja/sql-reference/sql/create-iceberg-table-rest)

## Snowflake における Iceberg テーブルの基本的な利用方法

### Snowflake Catalog における Iceberg テーブルの基本操作

Snowflake と Google Colab を組み合わせた、Snowflake Catalog の基本操作を下記の記事にまとめました。

- [Snowflake Catalog における Iceberg テーブルの基本的な操作手順 - Qiita](https://qiita.com/manabian/items/69761bde791d0f014246)

上記の記事では環境構築から始め、一連の操作を以下の流れで体験できます。Snowflake Catalog SDK を用いて外部サービス（記事内では Apache Spark）からデータを取得する手順も紹介されており、Snowflake Open Catalog を使わずに Apache Iceberg テーブルを参照することが可能です。また、テーブルを自動で Snowflake Open Catalog に同期し、Snowflake Open Catalog 経由でデータを提供する手順も確認できます。

- 環境構築  
  - Azure Stroage 環境の構築  
  - Snowflake 環境での事前準備  
  - 外部ボリュームの作成
- Snowflake 上での Snowflake-managed Iceberg テーブルの操作  
  - テーブル作成  
  - データロード  
  - クエリの実行
- Snowflake Catalog SDK による Spark からの接続
- Open Catalog への同期  
  - Snowflake Open Catalog 環境の準備  
  - 既存の Iceberg テーブルを Snowflake Open Catalog に同期  
  - テーブル作成時に Snowflake Open Catalog へ同期

### Snowflake Open Catalog の Iceberg テーブルの基本的な操作

Snowflake と Google Colab を組み合わせた、Snowflake Open Catalog の基本操作をまとめた記事も投稿しました。

- [Snowflake Open Catalog における Iceberg テーブルの基本的な操作手順 - Qiita](https://qiita.com/manabian/items/0965d17596da6883e686)

上記の記事では、以下の流れで一連の操作を体験できます。Snowflake Open Catalog の機能検証には Apache Spark が必要ですが、多くの方が利用しやすい Google Colab 上の Apache Spark を活用しています。

- 環境構築  
  - Azure Storage 環境の構築  
  - Snowflake Open Catalog のアカウントを作成
- Snowflake Open Catalog のカタログ構築  
  - 内部カタログの作成  
  - Azure Storage に対する認証設定  
  - Snowflake Open Catalog におけるロールの作成  
  - Snowflake Open Catalog における接続情報の作成  
  - Snowflake Open Catalog に対する権限付与
- Spark による Open Catalog のオブジェクト操作
- Iceberg テーブルに対する REFRESH の実行
- Iceberg テーブルに対する 自動 REFRESH 設定の実施

### 関連機能

#### Secure Data Sharing 機能

Iceberg テーブルでも Secure Data Sharing を利用できます。共有先が Snowflake の場合、Snowflake へデータを移動させずに Iceberg テーブルから直接データを共有できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/2ad5446e-8f79-47a3-80a0-3266ef6eab0a.png)

下記の記事で一連の手順を紹介しています。  
- [Snowflake Apache Iceberg™ table における Secure Data Sharing 機能を試してみた #iceberg - Qiita](https://qiita.com/manabian/items/f2d81fbe42bb1c283869)

#### Cloning 機能

Snowflake-managed の Iceberg テーブルでは Cloning 機能を利用できます。ただし、外部カタログを利用する Iceberg テーブルではサポートされません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5db7975e-e14e-47e3-8aa9-2ae1cd1c79fe.png)
出所：[CREATE ICEBERG TABLE ... CLONE | Snowflake Documentation](https://docs.snowflake.com/ja/sql-reference/sql/create-iceberg-table-snowflake#create-iceberg-table-clone)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ad0a307b-3741-40f4-8857-9d3b945bdf1d.png)
出所：[考慮事項と制約 | Snowflake Documentation](https://docs.snowflake.com/ja/user-guide/tables-iceberg#considerations-and-limitations)

Hadoop Catalog などを外部カタログとして利用する際には、metadata ディレクトリに複数のテーブルのバージョン情報が格納される仕様上、注意が必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/08845b93-3fe2-442b-835a-9142f08109d1.png)
出所：[Snowflake-managed Apache Iceberg™ table におけるクローニング機能を試してみた #iceberg - Qiita](https://qiita.com/manabian/items/81983193d9df4b854184)

具体的な手順は以下の記事にまとめています。
- [Snowflake-managed Apache Iceberg™ table におけるクローニング機能を試してみた #iceberg - Qiita](https://qiita.com/manabian/items/81983193d9df4b854184)

#### Iceberg テーブルの変更データの取得

Iceberg テーブルの変更データは、`STREAM` 機能と `CHANGE TRACKING` 機能で取得できます。取得内容はほぼ同等なので、要件に応じて使い分けるとよいでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/bf0894bd-2918-4955-ae97-11360caa1f3b.png)
出所：[ストリームの紹介 | Snowflake Documentation](https://docs.snowflake.com/ja/user-guide/streams-intro)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1fb1b409-1ec9-4dd8-ac47-47efb2ff3fb3.png)
出所：[CREATE ICEBERG TABLE （IcebergカタログとしてのSnowflake） | Snowflake Documentation](https://docs.snowflake.com/ja/sql-reference/sql/create-iceberg-table-snowflake#optional-parameters)

詳細な手順は以下の記事を参照してください。
- [Snowflake-managed Apache Iceberg™ table における STREAM 機能を試してみた #iceberg - Qiita](https://qiita.com/manabian/items/1a1298fb46b70aa69065)  
- [Snowflake-managed Apache Iceberg™ table における CHANGE TRACKING 機能を試してみた #iceberg - Qiita](https://qiita.com/manabian/items/590812fb96374d129802)

#### Delta Lake の Iceberg テーブル化機能

Snowflake では、Delta Lake 形式のディレクトリから Iceberg テーブルを作成する機能があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0fe5892b-e6fe-43c8-9133-f6069d9fad56.png)
出所：[CREATE ICEBERG TABLE （オブジェクトストレージ内のDeltaファイル） | Snowflake Documentation](https://docs.snowflake.com/ja/sql-reference/sql/create-iceberg-table-delta)

下記の記事で具体的な手順を確認できます。
- [Snowflake Apache Iceberg™ table を Delta Lake 形式のディレクトリから作成する機能を試してみた #iceberg - Qiita](https://qiita.com/manabian/items/7b1866cb98ce2539697a)

Delta Lake の利用時にはいくつかの制限事項が存在し、Snowflake ドキュメントに下記のように記載されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a6d3c504-e434-479f-a8c0-b610c31ce35b.png)

出所：[考慮事項と制約 | Snowflake Documentation](https://docs.snowflake.com/ja/user-guide/tables-iceberg#considerations-and-limitations)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/89edc9e4-1b0c-471c-bd3d-4e2d4e8d1225.png)

出所：[使用上の注意 | Snowflake Documentation](https://docs.snowflake.com/ja/sql-reference/sql/create-iceberg-table-delta#usage-notes)

日本語ドキュメントでは Delta Lake 3.1 バージョンとの互換性が明記されていますが、筆者の検証では Delta Lake 3.2.1 でも読み込みが成功しました。これは Delta Lake の "minReaderVersion" によるプロトコルバージョンが関係している可能性があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/be3baba7-eb0c-4dde-86c5-d20e6ca88048.png)
出所：[How does Delta Lake manage feature compatibility? — Delta Lake Documentation](https://docs.delta.io/3.1.0/versioning.html#features-by-protocol-version)

## 利用時の注意事項

### ドキュメントは英語を優先して確認する

Apache Iceberg に関連する機能開発は日々活発に進行しています。2025年3月9日時点では、日本語ドキュメントに最新の情報が反映されていないケースが確認されました。最新情報や正確な仕様を把握するためには、英語版ドキュメントを優先的に参照することをおすすめします。

たとえば、Snowflake Catalog SDK がサポートしているサービスについて、日本語ドキュメントでは Apache Spark のみとなっている箇所がありましたが、英語ドキュメントでは Apache Spark と Trino の両方が記載されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7dc61a81-9085-40e0-8b35-433b44afb62c.png)

出所：[制限事項 | Snowflake Documentation](https://docs.snowflake.com/ja/user-guide/tables-iceberg-catalog#limitations)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6c0b7cb0-13b4-4559-9fc7-5b9f59c2d354.png)

出所：[Limitations | Snowflake Documentation](https://docs.snowflake.com/en/user-guide/tables-iceberg-catalog#limitations)

また、Delta Lake 形式の Auto Refresh についても同様に英語ドキュメントが最新です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5d5d2726-45c9-442d-9fba-078f72906345.png)

出所：[Apache Iceberg™ テーブルの自動リフレッシュ | Snowflake Documentation](https://docs.snowflake.com/ja/user-guide/tables-iceberg-auto-refresh)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/711d63a0-4ea8-4152-9bdf-5457877843f7.png)

出所：[Automatically refresh Apache Iceberg™ tables | Snowflake Documentation](https://docs.snowflake.com/en/user-guide/tables-iceberg-auto-refresh)

生成 AI サービスの回答がドキュメントの整合がとれてないことから、ハルシネーションと私が勘違いしてしまいました。そんな過ちをする前に、英語のドキュメントを確認したほうがよさそうです。

### ウェアハウス仕様による性能面の懸念

Snowflakeで Apache Iceberg™ テーブルを操作する際のベストプラクティスの記事にて下記のように記述があり、他サービスと比較したときに期待以上の性能とならない可能性があります。記述内容から判断すると、少数列の大量データの場合にはデータ参照がボトルネックになる可能性があります。下記の仕様がなくなる可能性もありますが、もしユースケースによっては性能の問題が発生すること可能性を認識しておいていたほうがよさそうです。

> Snowflakeはテーブルの列スキャンを並列化しません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1ebe818d-a029-450b-aab3-c27ae6548ff6.png)

出所：[ベストプラクティス | Snowflake Documentation](https://docs.snowflake.com/ja/user-guide/tables-iceberg-best-practices#increase-warehouse-size)

### ファイルサイズによる性能面の懸念

Snowflake はマイクロパーティションに最適化された設計であり、他サービス（Apache Spark や Trino など）で推奨されるファイルサイズと異なります。Snowflake では圧縮後ファイルが約 16 MB 前後になる一方、他サービスでは 100 MB〜1 GB 程度が推奨される場合があります。AWSのベストプラクティスでは、100MB以上のファイルサイズを推奨しています。

> 通常、Parquet ファイルと ORC ファイルを 100 MB 以上にしておくことをお勧めします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5d1be683-4279-4329-a767-ba5ac777020d.png)

出所：[読み取りパフォーマンスの最適化 - AWS 規範ガイダンス](https://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/apache-iceberg-on-aws/best-practices-read.html#read-file-size)

2025年3月5日時点の検証では、Snowflake 管理 Iceberg テーブルの `STORAGE_SERIALIZATION_POLICY` を `OPTIMIZED` か `COMPATIBLE` のどちらに設定しても、生成されるファイルサイズは 30 MB 以下でした。

そのため、Snowflake から外部システムへ Iceberg 形式でデータを提供する場合は「ファイルサイズが小さすぎる」ことによる性能低下、逆に外部システムから Snowflake へデータを提供する場合は「ファイルサイズが大きすぎる」ことで性能上の問題が起こる可能性があります。

### ファイルフォーマットに関する懸念事項


Apache Iceberg のデータレイヤーで利用される Parquet ファイルのフォーマット（主に圧縮形式とエンコード方式）については、十分な注意が必要です。特に、Snowflake から他システムへ連携する場合と、他システムから Snowflake へ連携する場合では、それぞれ異なる留意点があります。

Snowflake から他システムへデータ連携を行う際は、`STORAGE_SERIALIZATION_POLICY` オプションにより圧縮形式とエンコード方式が変更されます。2025年3月5日現在、`OPTIMIZED` オプションで採用される具体的な圧縮形式やエンコード方法が公式ドキュメントに明記されていないため、相互運用性を考慮すると、`COMPATIBLE` オプションの選択がより安全です。

2025年3月5日時点での検証結果は以下のとおりです。

- `OPTIMIZED` オプションの場合：圧縮形式は非圧縮であり、エンコード方式はカラムごとに設定されています。
- `COMPATIBLE` オプションの場合：圧縮形式は ZSTD、エンコード方式は PLAIN です。

> - COMPATIBLE: Snowflakeは、サードパーティのコンピューティングエンジンとの相互運用性を実現するエンコードと圧縮を実行します。
> - OPTIMIZED: Snowflakeは、Snowflake内で優れたテーブルパフォーマンスを実現するエンコードと圧縮を実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/da040d57-fccb-4865-80a0-7598a5d928b8.png)

出所：[CREATE ICEBERG TABLE （IcebergカタログとしてのSnowflake） | Snowflake Documentation](https://docs.snowflake.com/ja/sql-reference/sql/create-iceberg-table-snowflake#optional-parameters)

また、Snowflake から他システムへ連携する際には、圧縮形式およびエンコード方式について十分な検討が必要です。クラウドストレージに書き込みを行い、 PyArrow 等のライブラリで確認し方がよさそうです。

### MoR（Merge-on-Read）で書き込まれたデータへの注意

Snowflake は現状、行レベルの削除（Row-level deletes）をサポートしていません。そのため、外部サービスで MoR (Merge-on-Read) を使って書き込みが行われると、Snowflake が正しく処理できない可能性があります。たとえば、Amazon Athena では更新、削除、MERGE がすべて MoR で書き込まれます。Snowflake に取り込むデータにおいて Row-level deletes が発生しないよう、運用側で統制が必要です。

> - Apache Iceberg仕様のバージョン1と2は、次の 機能: を除いてサポートされています。
>     - 行レベルの削除（位置の削除または均等削除のいずれか）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7a60a225-f091-4920-b61c-60f331b46174.png)

出所：[考慮事項と制約 | Snowflake Documentation](https://docs.snowflake.com/ja/user-guide/tables-iceberg#considerations-and-limitations)

> In Athena, update, delete, and merge operations always default to merge on read (MoR), regardless of any copy on write (CoW) settings in the table properties, because CoW isn't supported.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b9f6b599-a8f2-4315-a223-ce95bd046e3a.png)

出所：[Working with Apache Iceberg tables by using Amazon Athena SQL - AWS Prescriptive Guidance](https://docs.aws.amazon.com/prescriptive-guidance/latest/apache-iceberg-on-aws/iceberg-athena.html)

> Athena では、CoW がサポートされていないため、テーブル プロパティのコピー オン ライト (CoW) 設定に関係なく、更新、削除、マージ操作は常にデフォルトで読み取り時にマージ (MoR) になります。

上記の翻訳

Cow と MoR については、下記の記事にて紹介しています。

- [Google Colab の Spark にて Apache Iceberg の CoW と MoR の動作検証 #iceberg - Qiita](https://qiita.com/manabian/items/b78b1361b53411458a94)

### 利用するクラウドリージョンに注意

Snowflake のクラウドプロバイダとリージョン、Iceberg テーブルのデータを配置するストレージが異なる場合、大量データの転送でエグレスコストが膨大になる可能性があります。Snowflake ドキュメントでも注意が促されていますが、大きなコスト増につながる恐れがあるため、Snowflake とストレージは同一リージョン・同一クラウドを基本とするのが望ましいでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ddd3995a-e0dc-4595-9116-3db6bd08ac02.png)
出所：[Apache Iceberg™ テーブル | Snowflake Documentation](https://docs.snowflake.com/ja/user-guide/tables-iceberg#billing)

### 利用できない機能

Snowflake の Iceberg テーブルでは、Snowflake の標準テーブルなどでサポートされている一部の機能を利用できない場合があります。ドキュメント中に「外部カタログを使用する Iceberg テーブルではサポートされません」と記載されている場合は、Snowflake 管理 Iceberg テーブルでは利用可能ですが、外部カタログを使用するテーブルでは利用不可であることを意味します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d9f7a073-4134-407b-bace-50be306a7da7.png)