Apache Iceberg™ テーブルのメタデータと保持¶
Snowflakeは、使用するカタログのタイプ(Snowflakeまたは外部)に従って、 Apache Iceberg™ テーブルのメタデータを処理します。
注釈
history.expire.min-snapshots-to-keep テーブルプロパティ を使用してスナップショットのデフォルトの最小数を指定することは、どのタイプのIcebergテーブルでもサポートされていません。
Snowflakeをカタログとして使用するテーブル¶
Snowflakeはこのテーブルタイプのメタデータのライフサイクルを管理し、テーブルデータとスナップショットの保持期間に基づいて古いメタデータ、マニフェストリスト、マニフェストファイルを削除します。
テーブルデータとスナップショットの保持期間を設定するには、アカウント、データベース、スキーマ、またはテーブルレベルで DATA_RETENTION_TIME_IN_DAYS パラメーターを設定します。
作成¶
Snowflakeは、Apache Iceberg仕様のバージョン2のメタデータを定期的に生成し、メタデータを外部ボリューム上のファイルに書き込みます。それぞれの新しいメタデータファイルには、最後にSnowflakeが生成したメタデータファイルが作成されてから、 DML または DDL のすべての変更が含まれています。
SYSTEM$GET_ICEBERG_TABLE_INFORMATION 関数を使用して、オンデマンドでメタデータを作成することもできます。手順については、 DML の変更のスナップショットを生成する をご参照ください。
メタデータファイルの場所については、 データとメタデータのディレクトリ を参照してください。
メタデータ作成履歴の表示¶
メタデータ生成の全試行履歴にアクセスするには、アカウントのクエリ履歴を表示し、結果をフィルタリングします。SQL テキストから SYSTEM$GET_ICEBERG_TABLE_INFORMATION 関数名を検索します。
Snowflakeは内部的に同じ SYSTEM$GET_ICEBERG_TABLE_INFORMATION 関数を使用してテーブルメタデータを生成します。Snowflakeによる試行は、クエリ履歴の SYSTEM というユーザーの下に表示されます。クエリ履歴の STATUS 列は、メタデータが正常に生成されたかどうかを示します。
表示オプションについては、 クエリ履歴でクエリのアクティビティをモニターする を参照してください。
削除¶
以下のイベントが発生すると、Snowflakeは外部クラウドストレージからIcebergメタデータを削除します。
テーブルを削除した後。
Icebergメタデータが期限切れのスナップショットまたはテーブルデータを参照している場合。
データ保持期間が終了しても、すぐに削除されるわけではありません。その結果、メタデータストレージは、クラウドストレージプロバイダーによって、テーブルの寿命よりも長い期間コストが発生する可能性があります。
警告
Snowflakeは、Snowflake管理Icebergテーブルの Fail-safe をサポートしていません。テーブルデータはお客様が管理する外部クラウドストレージにあるためです。Icebergテーブルのデータを保護するには、クラウドプロバイダーにデータ保護と回復を構成する必要があります。
テーブルを削除した後¶
テーブルを削除した場合、 UNDROP ICEBERG TABLE コマンドを使用することで、データ保持期間内にテーブルを復元することができます。
保持期間が終了すると、Snowflakeは外部ボリュームの場所から書き込んだテーブルメタデータとスナップショットを削除します。削除は非同期に行われ、保持期間が過ぎてから完了するまで数日かかることもあります。
注釈
変換されたテーブル に対して、Snowflakeはテーブル変換 後に 生成されたメタデータのみを削除します。
スナップショットの期限が切れた後¶
Snowflakeは、データ保持期間が過ぎると、期限切れのスナップショットに関連するIcebergメタデータファイルを削除します。削除は通常、スナップショットの期限が切れてから7~14日後に行われます。
期限切れになるのは、以前のテーブルスナップショットだけです。Snowflakeは、外部クラウドストレージからテーブルの最新(現在の)状態を表すメタデータファイルを削除することはありません。
外部カタログを使用するテーブル¶
外部カタログを使用するテーブルの場合、Snowflakeは、 DATA_RETENTION_TIME_IN_DAYS の値を使用して、Snowflake Time Travelの保持期間を設定し、テーブルをドロップ解除します。保持期間が終了しても、Snowflakeは、外部クラウドストレージからIcebergメタデータまたはスナップショットを 削除しません。
Snowflakeは、テーブルレベルで DATA_RETENTION_TIME_IN_DAYS を次の値のうちの小さい方に設定します。
現在のメタデータファイルの
history.expire.max-snapshot-age-msの値。Snowflakeは値を日数に変換します(切り捨て)。Snowflakeアカウントのエディション に応じて、以下の値を指定します。
Standard Edition:1日。
Enterprise Editionまたはそれ以上:5日。
Snowflakeでは、DATA_RETENTION_TIME_IN_DAYSの値を手動で変更することはできません。値を変更するには、メタデータファイルの history.expire.max-snapshot-age-ms を更新し、 テーブルをリフレッシュ する必要があります。
外部で管理されているIcebergテーブルに登録されているファイルの情報や、最新のスナップショットの更新履歴を取得するには、以下のテーブル関数を使用します。
Deltaベーステーブル¶
注釈
Delta ベースの Iceberg テーブルにメタデータ書き込みを使用する場合は、 2025_01 動作変更バンドル をアカウントで無効にしないでください。
Deltaテーブルファイルから作成されたIcebergテーブルの場合、外部ボリュームに書き込みアクセスを構成すると、Snowflakeは自動的にIcebergメタデータを外部ストレージに書き込みます(ALLOW_WRITES を参照)。書き込み位置の情報については、 データとメタデータのディレクトリ をご参照ください。
SnowflakeがIcebergメタデータを書き込まないようにするには、Snowflakeが管理するIcebergテーブルが同じ外部ボリュームを使用していない限り、外部ボリュームで ALLOW_WRITES パラメーターを FALSE にセットします。
Icebergパーティショニング¶
「非表示」パーティション分割 の Apache Iceberg™ はメタデータベース型で適応型です。Icebergは、テーブルを作成するときに定義した変換に基づいてパーティション値を生成します。パーティション化されたテーブルから読み込む際、Icebergエンジンはテーブルメタデータで定義されたパーティション値を使用して、関連するデータを効率的に識別します。
Snowflakeは、次のパーティション分割のユースケースをサポートしています。
パーティション化されたIcebergテーブルの読み取りと書き込み。
Snowflake管理、または外部管理のパーティション化されたIcebergテーブルを カタログリンクのデータベース または :doc:`Iceberg によって外部管理される REST カタログ </user-guide/tables-iceberg-externally-managed-writes>`内に作成します。
パーティション化されたIcebergテーブルを作成するには、 通常の CREATE ICEBERG TABLE ステートメントに`パーティション変換 <https://iceberg.apache.org/spec/#partition-transforms>`_(1つ以上)を含む PARTITIONBY句 を含めます。例については、 カタログリンクデータベースでのIcebergテーブルの作成 をご参照ください。
パーティション分割サポートマトリックス¶
次の表は、パーティショニングされたIcebergテーブルの各タイプでサポートされている機能とアクションを示し、Apache Iceberg仕様のバージョン2への準拠を示しています。
注釈
Apache Iceberg仕様のバージョン3は、パーティション分割を使用する場合はサポートされません。
CLDは、カタログリンクデータベースを意味します。
Snowflake管理 |
外部管理(CLD) |
外部管理(CLD以外) |
Iceberg spec V2の互換性 |
コメント |
|
|---|---|---|---|---|---|
COPY のコマンドに ON_ERROR = ABORT_STATEMENT オプションを指定します。 |
❌ |
❌ |
❌ |
❌ |
|
COPY INTO <テーブル> |
限定サポート |
限定サポート |
限定サポート |
限定サポート |
使用上の注意 をご参照ください。 |
CREATE ICEBERG TABLE ... AS SELECT (CTAS) |
✔ |
✔ |
✔ |
✔ |
|
クローニング |
✔ |
✔ |
✔ |
✔ |
使用上の注意をご参照ください。 |
CREATE ICEBERG TABLE … LIKE |
✔ |
✔ |
✔ |
✔ |
使用上の注意をご参照ください。 |
削除ベクター |
❌ |
❌ |
❌ |
N/A |
|
クラスタリング |
❌ |
❌ |
❌ |
❌ |
|
TARGET_FILE_SIZE |
❌ |
❌ |
❌ |
❌ |
パーティションは16 MB ファイルサイズで書き込まれます。 |
パーティションの進化 |
❌ |
限定サポート |
限定サポート |
限定サポート |
外部エンジンで行われた場合、パーティションの進化をサポートします。 |
パーティションの変換 |
✔ |
✔ |
✔ |
✔ |
サポートされているパーティション変換については、次をご参照ください。 |
位置の削除 |
❌ |
❌ |
❌ |
N/A |
|
Snowpipe |
❌ |
❌ |
❌ |
❌ |
|
Snowpipe Streaming |
❌ |
❌ |
❌ |
❌ |
|
パーティション内の並べ替え |
❌ |
❌ |
❌ |
❌ |
パーティション分割の考慮事項¶
Icebergテーブルにパーティション書き込みを使用する前に、次の点を考慮してください。
外部エンジンを使用して外部管理テーブルのパーティションフィールドを追加、ドロップ、または置換すると、Snowflakeは最新のパーティション仕様に従ってデータを書き込みます。
Snowflakeはパーティション化されたテーブルに対して、ターゲットファイルサイズとして16MBを使用します。デフォルトのファイルサイズが大きい場合、パーティション化されたテーブルに書き込み時にSnowflakeは自動的にターゲットサイズを16 MBに縮小します。
GET_DDL 関数の出力には PARTITIONBY 句は含まれません。
すべてのパーティション変換の出力サイズの合計は、1行で1024バイトを超えることはできません。
パーティション進化はSnowflake管理テーブルではサポートされていないため、テーブルをドロップし、パーティション分割で新しいテーブルを作成する必要があります。
テーブルプロパティのPARTITIONBY句内で指定する DAY()、 MONTH()、 YEAR()パーティション変換パラメーターは、Iceberg仕様の一部です。複数の日、月、または年の場合、パーティション式パラメーターは、各暦日、月、または年のパーティションを返します。たとえば、2か月のデータを持つタイムスタンプ列に対して DAY()変換を使用すると、61個のパーティションが作成されます。
対比するに、Snowflakeの DAY()、 MONTH()、 YEAR()関数、 は SQL 標準の一部です。複数の日、月、または年の場合、これらの関数は、日付またはタイムスタンプから対応する日、月、または年の部分を抽出します。たとえば、DAY()関数は、複数か月のデータを持つタイムスタンプ列で使用されます。この関数は、1から31の範囲の月の日を返します。
Time Travel¶
Snowflake Time Travel を使用すると、Snowflakeを使用してテーブルの履歴データをクエリできます。
また、サードパーティのコンピュートエンジンを使用して、 Snowflakeで管理されたテーブルを Snowflake Open Catalog と同期する または Snowflakeカタログ SDK を使用する際に、Snowflakeで管理されたテーブルに対してTime Travelクエリを実行することもできます。
データ保持期間内にコミットされたスナップショットをクエリできます。データ保持期間を指定するには、 DATA_RETENTION_TIME_IN_DAYS オブジェクトパラメーターを設定します。
テーブルデータを削除したり、テーブルをドロップすると、Snowflakeはテーブルの保持期間が終了した後にオブジェクトを削除します。この場合、クラウドストレージプロバイダーとの間で、テーブルの耐用年数以上のコストが発生する可能性があります。