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™ テーブルのメタデータと保持 をご参照ください。
クロスクラウド/クロスリージョンのサポート¶
Snowflakeは、Snowflakeアカウントをホストしているクラウドプロバイダーとは異なる(リージョンが異なる)外部ボリュームストレージの場所を使用することをサポートしています。
テーブルタイプ |
クロスクラウド/クロスリージョンのサポート |
注意 |
---|---|---|
カタログ統合 で外部カタログを使用するテーブル |
✔ |
Snowflakeアカウントと外部ボリュームが異なるリージョンにある場合、外部クラウドストレージアカウントでテーブルをクエリする際にエグレスコストが発生します。 |
SnowflakeをIcebergカタログとして 使用するテーブル |
✔ |
Snowflakeアカウントと外部ボリュームが異なるリージョンにある場合、外部クラウドストレージアカウントでテーブルをクエリする際にエグレスコストが発生します。 これらのテーブルでは、リージョンをまたいだデータ転送の使用コストが発生します。詳細については、 請求 をご参照ください。 |
請求¶
Snowflakeは、Icebergテーブルを使用する際に、仮想ウェアハウス(コンピュート)の使用料とクラウドサービスをアカウントに請求します。また、Snowflakeは、お客様が 自動リフレッシュ を使用した場合にも、お客様のアカウントに請求します。
Snowflake が管理する Iceberg テーブルがクロスクラウド/クロスリージョンの場合、Snowflake はクロスリージョンのデータ転送使用量を DATA_LAKE の TRANSFER_TYPE 下に請求します。詳細については、次をご参照ください。
ORGANIZATION_USAGE スキーマの DATA_TRANSFER_HISTORY ビュー
ACCOUNT_USAGE スキーマの DATA_TRANSFER_HISTORY ビュー
Snowflakeはお客様のアカウントに次について請求 しません。
Icetableテーブルのストレージコスト。クラウドストレージプロバイダーがデータストレージの使用料を直接請求します。
Icebergテーブルが使用するアクティブなバイト数。ただし、 INFORMATION_SCHEMA.TABLE_STORAGE_METRICS と ACCOUNT_USAGE.TABLE_STORAGE_METRICS ビューがIcebergテーブルの ACTIVE_BYTES を表示し、テーブルがどれだけのストレージを占有しているかを把握するのに役立ちます。表示例については、 ストレージメトリックの取得 をご参照ください。
注釈
Snowflakeアカウントと外部ボリュームが異なるリージョンにある場合、外部クラウドストレージアカウントでテーブルをクエリする際にエグレスコストが発生します。
カタログオプション¶
Snowflakeは以下のIcebergカタログオプションをサポートしています。
Snowflakeを Icebergカタログ として使用
外部Icebergカタログを使用
次のテーブルは、これらのオプションの相違点をまとめたものです。
読み取りアクセス |
✔ |
✔ |
書き込みアクセス |
✔ |
❌ Snowflakeプラットフォームのサポートに、カタログとしてSnowflakeを使用するようにテーブルを変換することができます。 |
リージョンをまたいだ書き込みアクセス |
✔ |
❌ |
データとメタデータのストレージ |
外部ボリューム(クラウドストレージ) |
外部ボリューム(クラウドストレージ) |
Snowflakeプラットフォームのサポート |
✔ |
❌ |
Snowflake Open Catalog との統合 |
✔ Snowflakeで管理されたテーブルを Open Catalog と同期して、他のコンピュートエンジンを使ってテーブルをクエリすることができます。 |
✔ Snowflakeを使用して、 Open Catalog で管理されているIcebergテーブルをクエリできます。 |
✔ |
✔ |
カタログとしてSnowflakeを使用¶
IcebergカタログとしてSnowflakeを使用するIcebergテーブル(Snowflake管理Icebergテーブル)は、読み取りおよび書き込みアクセスでSnowflakeプラットフォームを完全にサポートします。テーブルデータとメタデータは外部クラウドストレージに保存され、Snowflakeは 外部ボリューム を使用してアクセスします。Snowflakeがテーブルのコンパクションなど、ライフサイクルのメンテナンスをすべて行います。
外部カタログの使用¶
カタログ統合を使用するIcebergテーブルは、読み取り専用アクセスで限定的なSnowflakeプラットフォームサポートを提供します。このテーブル型では、Snowflakeは カタログ統合 を使用してIcebergメタデータとスキーマに関する情報を取得します。
このオプションを使用して、以下のソースのIcebergテーブルを作成できます。
AWS Glueデータカタログ
オブジェクトストレージのIcebergメタデータファイル
オブジェクトストレージのデルタテーブルファイル
Open Catalog
リモートIceberg REST カタログ
Snowflakeはテーブルのライフサイクル管理を行いません。
テーブルデータとメタデータは外部クラウドストレージに保存され、Snowflakeは 外部ボリューム を使用してアクセスします。
注釈
外部カタログを使用するIcebergテーブルでSnowflakeプラットフォームの完全サポートを希望する場合は、カタログとしてSnowflakeを使用するように変換できます。詳細については、 Snowflakeをカタログとして使用するように Apache 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変換を定義する場合に作成されます。
行レベル削除 の場合:
Snowflake は 位置の削除 のみをサポートしています。
行レベル削除を使用する際に最高の読み取りパフォーマンスを得るには、定期的にコンパクションとテーブル・メンテナンスを行い、古い削除ファイルを削除してください。詳細については、 外部カタログを使用するテーブルの維持 をご参照ください。
行レベル削除を使用する場合、以下の機能は現在サポートされていません。
自動リフレッシュ
動的テーブル、動的 Iceberg テーブル、または既存の位置が削除された Iceberg テーブルに対するマテリアライズド・ビュー、検索最適化、またはストリームの作成。
動的テーブル
動的テーブル、動的 Iceberg テーブル、またはアクティブまたは削除されたマテリアライズド・ビュー、検索最適化、またはストリームを持つ Iceberg テーブルの位置削除による Iceberg スナップショットのリフレッシュ。
検索最適化
ストリーム
ファイル形式
IcebergテーブルはApache Parquetファイルをサポートしています。
符号なし整数論理型を使用するParquetファイルはサポートされていません。
LIST
論理的タイプを使用する Parquet ファイルでは、以下の点に注意してください。
element
キーワードによる3レベルの注釈構造がサポートされています。詳細については、 Parquet理論型の定義 をご参照ください。Parquet ファイルがarray
キーワードで廃止された形式を使用している場合は、サポートされている形式に基づいてデータを再生成する必要があります。
外部ボリューム
ストレージ統合を使用して外部ボリュームのクラウドストレージの場所にアクセスすることはできません。
作成する外部ボリュームごとに個別の信頼関係を構成する必要があります。
アウトバウンドプライベート接続 を使用して、Snowflake管理Icebergテーブルおよびオブジェクトストレージにカタログ統合を使用するIcebergテーブルにアクセスできますが、他のカタログ統合を使用するIcebergテーブルにアクセスすることはできません。
Snowflake管理テーブルを作成した後、外部ストレージ内のファイルへのパスは、テーブル名を変更しても変更され ません。
Snowflakeは、ドットを含むS3バケット名を持つ外部ボリュームをサポートできません(例えば、
my.s3.bucket
)。S3は、名前にドットが含まれる仮想ホスト形式のバケットの SSL をサポートしておらず、Snowflakeは仮想ホスト形式のパスと HTTPS を使用してS3のデータにアクセスします。
メタデータファイル
メタデータファイルはIcebergテーブルの最新のスナップショットを識別しません。
ALTER ICEBERG TABLE コマンドを使用してデータファイルやスナップショットの場所を変更することはできません。これらの設定を変更するには、テーブルを(CREATE OR REPLACE ICEBERG TABLE 構文を使用して)再作成する必要があります。
外部カタログを使用するテーブルの場合
マニフェストファイルに重複がないようにします。 同じ スナップショットに重複ファイルが存在する場合、Snowflakeは重複ファイルのパスを含むエラーを返します。
Parquetメタデータに無効な UTF-8文字が含まれている場合は、テーブルを作成できません。Parquetメタデータが UTF-8に準拠していることを確認してください。
Snowflakeは、Snowflakeの外部で生成されたParquetメタデータの破損や不整合を検出し、エラーメッセージを通じて問題を表面化します。
テーブルのメタデータに一貫性がなくても、外部で管理された(または変換された)テーブルを作成、リフレッシュ、クエリすることができます。Icebergデータを書き込む場合は、テーブルのメタデータの統計情報(
RowCount
やNullCount
など)がデータ内容と一致していることを確認してください。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リーダーバージョン2をサポートしており、Delta Lakeバージョン2.2.0を使用しているエンジンによって書かれたすべてのテーブルを読み込むことができます。
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 データ型。
TIMESTAMP にParquet物理タイプ
int96
を使用できますが、Snowflakeでは TIMESTAMP_NTZ にint96
をサポートしていません。
Deltaデータ型とIcebergテーブルの詳細については、 デルタデータ型 をご参照ください。
Snowflakeは、 CREATE/ALTER ... REFRESH を使用してテーブルをリフレッシュするたびに、最大1000個のデルタコミットファイルを処理します。テーブルのコミットファイルが1000個を超える場合は、さらに手動でリフレッシュできます。毎回、リフレッシュ処理は前回の停止位置から続行されます。
注釈
SnowflakeはIcebergテーブルを作成する際にDeltaチェックポイントファイルを使用します。1,000コミットファイルの制限は、最新のチェックポイント以降のコミットにのみ適用されます。
既存のテーブルを更新する場合、Snowflakeはデルタコミットファイルを処理しますが、チェックポイントファイルは処理しません。テーブルメンテナンスでソースデルタテーブルの古いログとデータファイルが削除された場合、SnowflakeのデルタベースのIcebergテーブルをデルタログとデータファイルの保持期間よりも頻繁に更新する必要があります。
以下のDalta Lakeフィーチャーは現在サポートされていません。行追跡、削除ベクターファイル、変更データファイル、変更メタデータ、 DataChange 、 CDC 、プロトコル進化。
自動リフレッシュ
自動リフレッシュが有効な場合、テーブルメタデータを手動でリフレッシュすることはできません。手動リフレッシュを行うには、まず 自動リフレッシュをオフにします。
Snowflakeバージョン8.22(またはDeltaベースのテーブルの場合は9.2)より前に作成されたカタログ統合では、そのカタログ統合に依存するテーブルの自動リフレッシュを有効にする前に、
REFRESH_INTERVAL_SECONDS
パラメーターを手動でセットする必要があります。手順については、 ALTER CATALOG INTEGRATION ... SET AUTO_REFRESH をご参照ください。テーブルが空の場合、未定義の動作を避けるため、自動リフレッシュを有効にする 前 に、Snowflakeで 手動リフレッシュを実行 してください。
オブジェクトストレージ用カタログ統合 の場合、自動リフレッシュは
TABLE_FORMAT = DELTA
との統合でのみサポートされます。更新頻度が高いテーブルでは、短いポーリング間隔 (
REFRESH_INTERVAL_SECONDS
) を使用するとパフォーマンスが低下することがあります。
サードパーティクライアントによるIcebergのデータ、メタデータへのアクセス
サードパーティクライアントは、Snowflakeをカタログとして使用しているIcebergテーブルへのデータの追加、削除、アップサートはできません。
サポート対象外機能
以下のSnowflake機能は、現在すべてのIcebergテーブルでサポートされていません。
クロスクラウドの自動フルフィルメント を可能にするリスト。
Icebergテーブル、外部ボリューム、またはカタログ統合の 複製。
Snowflakeの暗号化
ASSOCIATE_SEMANTIC_CATEGORY_TAGS ストアドプロシージャを使った タグ付け
以下の機能は、 外部カタログを使用する Icebergテーブルではサポートされません。
標準および追加のみの ストリーム。挿入のみのストリームはサポートされています。