Apache Iceberg™ テーブル

Snowflakeの Apache Iceberg™ テーブルは、一般的なSnowflakeテーブルのパフォーマンスとクエリセマンティクスに、管理する外部クラウドストレージを組み合わせたものです。Snowflakeに保存できない、または保存しないことを選択した既存のデータレイクに最適です。

Icebergテーブルは、 Apache Iceberg™ オープンテーブルフォーマット仕様を使用しています。これは、オープンフォーマットで保存されたデータファイルの抽象化レイヤーを提供し、以下のような機能をサポートしています。

  • ACID(原子性、一貫性、分離性、耐久性)トランザクション

  • スキーマの進化

  • 隠しパーティション

  • テーブルスナップショット

Snowflakeは Apache Parquet™ ファイル形式を使用するIcebergテーブルをサポートしています。

はじめるにあたり

Icebergテーブルを使い始めるには、 チュートリアル: Apache Iceberg™ テーブルを作成する をご参照ください。

仕組み

このセクションでは、 Snowflakeで Icebergテーブルを操作するための情報を提供します。Icebergテーブルフォーマット仕様の詳細については、公式の Apache IcebergドキュメントIcebergテーブル仕様 をご参照ください。

データストレージ

Icebergテーブルはデータとメタデータファイルを外部クラウドストレージ(Amazon S3、Google Cloud Storage、またはAzure Storage)に保存します。外部ストレージがSnowflakeの一部ではありません。データ保護と回復の構成を含む、外部クラウドストレージの場所のすべての管理はお客様の責任となります。Snowflakeは、Icebergテーブルの Fail-safe ストレージを提供しません。

Snowflakeは、 外部ボリューム を使用してストレージロケーションに接続し、IcebergテーブルにはSnowflakeのストレージコストはかかりません。詳細については、 請求 をご参照ください。

Icebergテーブルのストレージに関する詳細については、 Apache Iceberg™ テーブルのストレージ をご参照ください。

外部ボリューム

外部ボリュームは名前付きのアカウントレベルのSnowflakeオブジェクトで、SnowflakeをIcebergテーブル用の外部クラウドストレージに接続するために使用します。外部ボリュームには、ストレージ場所のIDおよびアクセス管理(IAM)エンティティが格納されます。Snowflakeは IAM エンティティを使用して、テーブルデータ、Icebergメタデータ、およびテーブルスキーマ、パーティション、その他のメタデータを格納するマニフェストファイルにアクセスするために、ストレージにセキュアに接続します。

1つの外部ボリュームで1つまたは複数のIcebergテーブルをサポートできます。

Icebergテーブルの外部ボリュームを設定するには、 外部ボリュームの構成 をご参照ください。

カタログ

Icebergカタログは、コンピュートエンジンがIcebergテーブルを管理し、ロードできるようにします。カタログは Icebergテーブル仕様 の最初のアーキテクチャーレイヤーを形成し、次をサポートする必要があります。

  • 1つ以上のIcebergテーブルの現在のメタデータポインターを格納する。メタデータポインターは、テーブル名とそのテーブルの現在のメタデータファイルの場所をマッピングします。

  • アトミック操作を実行することで、テーブルの現在のメタデータポインターを更新できる。

Icebergカタログについての詳細は Apache Icebergドキュメント をご参照ください。

Snowflakeは様々な カタログオプション をサポートしています。例えば、SnowflakeをIcebergカタログとして使用したり、 カタログ統合 を使用してSnowflakeをGlueのような外部のIcebergカタログに接続できます。

カタログ統合

カタログ統合は、名前付きのアカウントレベルのSnowflakeオブジェクトで、以下のシナリオのためにテーブルのメタデータがどのように整理されているかについての情報を格納します。

  • SnowflakeをIcebergカタログ として使用しない場合。例えば、テーブルがAWS Glue で管理されている場合、カタログ統合が必要です。

  • Snowflake Open Catalog と統合して、次のことを実現したい場合。

    • Snowflakeを使用して、 Snowflake Open Catalog でIcebergテーブルをクエリします。

    • サードパーティのコンピュートエンジンがテーブルをクエリできるように、Snowflakeが管理するIcebergテーブルを Snowflake Open Catalog と同期します。

1つのカタログ統合で1つまたは複数のIcebergテーブルをサポートできます。

カタログ統合を設定するには、 カタログ統合の構成 をご参照ください。

メタデータとスナップショット

Icebergはスナップショットベースのクエリモデルを使用しており、データファイルはマニフェストファイルとメタデータファイルを使用してマッピングされます。スナップショットは、ある時点におけるテーブルの状態を表し、テーブル内のデータファイル一式にアクセスするために使用されます。

テーブルのメタデータとTime Travelのサポートについては、 Apache Iceberg™ テーブルのメタデータと保持 をご参照ください。

クロスクラウド/クロスリージョンのサポート

クロスクラウド/クロスリージョンのサポートはIcebergテーブルのタイプによって異なります。

テーブルタイプ

クロスクラウド/クロスリージョンのサポート

メモ

カタログ統合 で外部カタログを使用するテーブル

外部ボリュームの アクティブなストレージの場所 がSnowflakeアカウントと同じクラウドプロバイダーまたは同じリージョンにない場合、以下の制限が適用されます。

  • 更新された最新のスナップショットに関する情報を取得するために SYSTEM$GET_ICEBERG_TABLE_INFORMATION 関数を使用することはできません。

  • カタログとしてSnowflakeを使用するようにテーブルを変換することはできません。

Snowflakeアカウントと外部ボリュームが異なるリージョンにある場合、外部クラウドストレージアカウントでテーブルをクエリする際にエグレスコストが発生します。

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

外部ボリュームは、Snowflakeアカウントをホストしているのと同じクラウドプロバイダー(同じリージョン内)の アクティブなストレージの場所 を使用する必要があります。

アクティブな場所が同じリージョンにない場合、 CREATE ICEBERG TABLE ステートメントはユーザーエラーを返します。

請求

Snowflakeは、Icebergテーブルを使用する際に、仮想ウェアハウス(コンピュート)の使用料とクラウドサービスをアカウントに請求します。また、Snowflakeは、お客様が 自動リフレッシュ を使用した場合にも、お客様のアカウントに請求します。

Snowflakeはお客様のアカウントに次について請求 しません

  • Icetableテーブルのストレージコスト。クラウドストレージプロバイダーがデータストレージの使用料を直接請求します。

  • Icebergテーブルが使用するアクティブなバイト数。ただし、 INFORMATION_SCHEMA.TABLE_STORAGE_METRICSACCOUNT_USAGE.TABLE_STORAGE_METRICS ビューがIcebergテーブルの ACTIVE_BYTES を表示し、テーブルがどれだけのストレージを占有しているかを把握するのに役立ちます。表示例については、 ストレージメトリックの取得 をご参照ください。

注釈

Snowflakeアカウントと外部ボリュームが異なるリージョンにある場合、外部クラウドストレージアカウントでテーブルをクエリする際にエグレスコストが発生します。

カタログオプション

Snowflakeは以下のIcebergカタログオプションをサポートしています。

次のテーブルは、これらのオプションの相違点をまとめたものです。

カタログとしてSnowflakeを使用

外部カタログの使用

読み取りアクセス

書き込みアクセス

Snowflakeプラットフォームのサポートに、カタログとしてSnowflakeを使用するようにテーブルを変換することができます。

データとメタデータのストレージ

外部ボリューム(クラウドストレージ)

外部ボリューム(クラウドストレージ)

Snowflakeプラットフォームのサポート

Snowflake Open Catalog との統合

Snowflakeで管理されたテーブルを Open Catalog と同期して、他のコンピュートエンジンを使ってテーブルをクエリすることができます。

Snowflakeを使用して、 Open Catalog で管理されているIcebergテーブルをクエリできます。

Snowflakeカタログ SDK と動作

カタログとしてSnowflakeを使用

IcebergカタログとしてSnowflakeを使用するIcebergテーブルは、読み取りと書き込みアクセスでSnowflakeプラットフォームを完全にサポートします。テーブルデータとメタデータは外部クラウドストレージに保存され、Snowflakeは 外部ボリューム を使用してアクセスします。Snowflakeがテーブルのコンパクションなど、ライフサイクルのメンテナンスをすべて行います。

SnowflakeをIcebergカタログとして使用するIcebergテーブルの仕組み

外部カタログの使用

カタログ統合を使用するIcebergテーブルは、読み取り専用アクセスで限定的なSnowflakeプラットフォームサポートを提供します。このテーブル型では、Snowflakeは カタログ統合 を使用してIcebergメタデータとスキーマに関する情報を取得します。

このオプションを使用して、以下のソースのIcebergテーブルを作成できます。

  • AWS Glueデータカタログ

  • オブジェクトストレージのIcebergメタデータファイル

  • オブジェクトストレージのデルタテーブルファイル

  • Open Catalog

  • リモートIceberg REST カタログ

Snowflakeはテーブルのライフサイクル管理を行いません。

テーブルデータとメタデータは外部クラウドストレージに保存され、Snowflakeは 外部ボリューム を使用してアクセスします。

次の図は、Icebergテーブルが外部Icebergカタログとのカタログ統合をどのように使用するかを示しています。

カタログ統合を使用するIcebergテーブルの仕組み

考慮事項と制約

次の考慮事項と制限はIcebergテーブルに適用され、変更される場合があります。

クラウドとリージョン

  • Icebergテーブルは、すべてのSnowflakeアカウント、すべてのクラウドプラットフォーム、中国リージョンを除くすべてのリージョンで利用可能です。

  • 外部カタログを使用する場合、クロスクラウド/クロスリージョンテーブルがサポートされます。詳細については、 クロスクラウド/クロスリージョンのサポート をご参照ください。

Iceberg

  • Apache Iceberg仕様のバージョン1と2は、次の 機能: を除いてサポートされています。

    • 行レベルの削除(位置の削除または均等削除のいずれか)。しかし、Snowflakeをカタログとして使用しているテーブルは、Snowflake DELETE ステートメントをサポートしています。

    • history.expire.min-snapshots-to-keep テーブルプロパティ を使用して、保持するデフォルトの最小スナップショット数を指定します。詳細については、 メタデータとスナップショット をご参照ください。

  • bucket 変換関数を使用したIcebergパーティショニングは、条件句を使用して結果をフィルターするクエリのパフォーマンスに影響を与えます。

  • Snowflakeで管理されていないIcebergテーブルについては、以下の点に注意してください:

    • スナップショットの有効期限が切れる前に定期的にテーブルをリフレッシュする限り、テーブル作成後に生成されたスナップショットへのTime Travelがサポートされます。

    • マテリアライズされていないIDパーティション列を持つテーブルの変換はサポートされていません。マテリアライズされていないIDパーティション列は、テーブルがParquetファイルに存在しないソース列を使用してID変換を定義する場合に作成されます。

ファイル形式

  • IcebergテーブルはApache Parquetファイルをサポートしています。

  • 符号なし整数論理型を使用するParquetファイルはサポートされていません。

外部ボリューム

  • ストレージ統合を使用して外部ボリュームのクラウドストレージの場所にアクセスすることはできません。

  • 作成する外部ボリュームごとに個別の信頼関係を構成する必要があります。

メタデータファイル

  • メタデータファイルはIcebergテーブルの最新のスナップショットを識別しません。

  • ALTER ICEBERG TABLE コマンドを使用してデータファイルやスナップショットの場所を変更することはできません。これらの設定を変更するには、テーブルを(CREATE OR REPLACE ICEBERG TABLE 構文を使用して)再作成する必要があります。

  • 外部カタログを使用するテーブルの場合

    • マニフェストファイルに重複がないようにします。 同じ スナップショットに重複ファイルが存在する場合、Snowflakeは重複ファイルのパスを含むエラーを返します。

    • Parquetメタデータに無効な UTF-8文字が含まれている場合は、テーブルを作成できません。Parquetメタデータが UTF-8に準拠していることを確認してください。

  • Snowflakeは、Snowflakeの外部で生成されたParquetメタデータの破損や不整合を検出し、エラーメッセージを通じて問題を表面化します。

    テーブルのメタデータに一貫性がなくても、外部で管理された(または変換された)テーブルを作成、リフレッシュ、クエリすることができます。Icebergデータを書き込む場合は、テーブルのメタデータの統計情報(RowCountNullCount など)がデータ内容と一致していることを確認してください。

  • Snowflakeをカタログとして使用するテーブルの場合、Snowflakeは DDL ステートメントを個別に処理し、他のカタログとは異なる方法でメタデータを作成します。詳細については、 DDL ステートメント をご参照ください。

クラスタリング

クラスタリング のサポートはIcebergテーブルの型によって異なります。

テーブルタイプ

メモ

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

CREATE ICEBERG TABLE または ALTER ICEBERG TABLE コマンドのいずれかを使用して、クラスタリングキーを設定します。クラスタリングキーを設定または管理するには、 CREATE ICEBERG TABLE (IcebergカタログとしてのSnowflake)ALTER ICEBERG TABLE をご参照ください。

外部カタログを使用するテーブル

クラスタリングはサポートされていません。

変換されたテーブル

Snowflakeは、テーブルを変換した後にファイルが作成された場合、または DML ステートメントを使用してファイルが変更された場合にのみ、ファイルをクラスタリングします。

デルタ

  • Snowflake ストリームは、パーティション列を持つ Delta テーブル・ファイルから作成された Iceberg テーブルではサポートされません。ただし、パーティション列の ない Delta・ファイルから作成されたテーブルの挿入専用ストリームはサポートされています。

  • Delta・テーブル・ファイルから作成されたIceberg・テーブルでは、動的テーブルはサポートされていません。

  • Snowflakeは、 AWS Glue Data CatalogのDeltaテーブル定義からIcebergテーブルを作成することをサポートしていません。

  • 以下の機能やデータタイプを使用したParquetファイル(Delta テーブルのデータファイル)はサポートされていません。

    • フィールド IDs

    • INTERVAL データ型。

    • 38以上の精度を持つ DECIMAL データ型。

    • LIST または MAP で、1レベルまたは2レベルの表現を持つタイプ。

    • 符号なし整数型 (INT(signed = false))。

    • FLOAT16 データ型。

    Deltaデータ型とIcebergテーブルの詳細については、 デルタデータ型 をご参照ください。

  • CREATE と ALTER ... REFRESH の間のリフレッシュ操作は、1回の操作につき最大1,000個のDelta コミット・ファイルを処理することができます。

    注釈

    SnowflakeはIcebergテーブルを作成する際にDeltaチェックポイントファイルを使用します。1,000コミットファイルの制限は、最新のチェックポイント以降のコミットにのみ適用されます。

  • SYSTEM$GET_ICEBERG_TABLE_INFORMATION 関数を使用したIcebergメタデータの生成はサポートされていません。

  • 以下のDalta Lakeフィーチャーは現在サポートされていません。行追跡、削除ベクターファイル、変更データファイル、変更メタデータ、 DataChange 、 CDC 、プロトコル進化。

自動リフレッシュ

  • 自動リフレッシュが有効な場合、テーブルメタデータを手動でリフレッシュすることはできません。手動リフレッシュを行うには、まず 自動リフレッシュをオフにします

  • Snowflakeバージョン8.22より前に作成されたカタログ統合では、そのカタログ統合に依存するテーブルの自動リフレッシュを有効にする前に、 REFRESH_INTERVAL_SECONDS パラメーターを手動で設定する必要があります。手順については、 ALTER CATALOG INTEGRATION ... SET AUTO_REFRESH をご参照ください。

  • 新しいテーブルスナップショットが現在のテーブルスナップショットの直接の子であることを確認してください。そうでなければ、自動リフレッシュは STOPPED 状態になります。これが発生した場合に自動リフレッシュを回復するには、 エラーの回復 を参照してください。

    • テーブルが空の場合、未定義の動作を避けるため、自動リフレッシュを有効にする 前に手動リフレッシュを実行 してください。

  • オブジェクトストレージにカタログ統合 を使用する場合、自動リフレッシュはサポートされません。

  • シーケンス番号列を持たないIcebergバージョン1マニフェストは現在サポートされていません。

サードパーティクライアントによるIcebergのデータ、メタデータへのアクセス

  • サードパーティクライアントは、Snowflakeをカタログとして使用しているIcebergテーブルへのデータの追加、削除、アップサートはできません。

サポート対象外機能

以下のSnowflake機能は、現在すべてのIcebergテーブルでサポートされていません。

以下の機能は、 外部カタログを使用する Icebergテーブルではサポートされません。