Apache Iceberg™ テーブルの管理

Snowflakeで Apache Iceberg™ テーブル を管理する

外部カタログを使用するIcebergテーブルを、IcebergカタログとしてSnowflakeを使用するテーブルに変換することもできます。詳細については、 Snowflakeをカタログとして使用するように Apache Iceberg™ テーブルを変換する をご参照ください。

テーブルをクエリする

Icebergテーブルにクエリを実行するには、ユーザーに次の権限を付与または継承させる必要があります。

  • テーブルを含むデータベースとスキーマに対するUSAGE権限。

  • テーブルに対するSELECT権限。

SELECT ステートメントを使用してIcebergテーブルにクエリを実行できます。例:

SELECT col1, col2 FROM my_iceberg_table;
Copy

Snowflakeで管理されたテーブルで DML コマンドを使用する

Snowflakeをカタログとして使用するIcebergテーブルは、以下を含む完全な データ操作言語(DML)コマンド をサポートしています。

注釈

Snowflake管理テーブルでは、 COPY INTO <テーブル>Snowpipe などの機能を使用した効率的な一括ロードもサポートしています。詳細については、 Apache Iceberg™ テーブルへのデータのロード をご参照ください。

例: テーブルの更新

INSERT および UPDATE ステートメントを使用して、Snowflake管理のIcebergテーブルを変更できます。

次の例は、 store_sales という名前のIcebergテーブルに新しい値を挿入し、現在の値が-99の場合、 cola 列を1に更新します。

INSERT INTO store_sales VALUES (-99);

UPDATE store_sales
  SET cola = 1
  WHERE cola = -99;
Copy

DML の変更のスナップショットを生成する

Snowflakeをカタログとして使用するテーブルの場合、Snowflakeは自動的にIcebergメタデータを生成します。Snowflakeはメタデータを外部ボリュームの metadata という名前のフォルダに書き込みます。 metadata フォルダーを見つけるには、 データとメタデータのディレクトリ をご参照ください。

あるいは、 SYSTEM$GET_ICEBERG_TABLE_INFORMATION 関数を呼び出して、新しい変更に対してIcebergメタデータを生成することもできます。

Snowflakeで管理されていないテーブルの場合、この関数は最新のリフレッシュされたスナップショットに関する情報を返します。

例:

SELECT SYSTEM$GET_ICEBERG_TABLE_INFORMATION('db1.schema1.it1');
Copy

出力:

+-----------------------------------------------------------------------------------------------------------+
| SYSTEM$GET_ICEBERG_TABLE_INFORMATION('DB1.SCHEMA1.IT1')                                                   |
|-----------------------------------------------------------------------------------------------------------|
| {"metadataLocation":"s3://mybucket/metadata/v1.metadata.json","status":"success"}                         |
+-----------------------------------------------------------------------------------------------------------+

行レベル削除の使用

注釈

外部管理Icebergテーブルのみサポートされています。

Snowflakeは、更新、削除、マージ操作に 行レベル削除 を構成している場合、 外部管理Icebergテーブル へのクエリをサポートします。

行レベルの削除を構成するには、Apache Icebergドキュメントの プロパティを書く をご参照ください。

コピーオンライトとマージオンリード

Icebergは、外部管理テーブルの行レベル操作を計算エンジンがどのように処理するかを構成するために2つのモードを提供します。Snowflakeはこの両方のモードをサポートしています。

次の表は、各モードを使用する場合の例です。

モード

説明

コピーオンライト(デフォルト)

このモードは読み出し時間を優先し、書き込み速度に影響します。

更新、削除、またはマージ操作を実行すると、コンピュートエンジンは影響を受けるParquetデータファイル全体を書き換えます。このため、特に大容量データファイルの場合、書き込みに時間がかかることがありますが、読み込み時間には影響しません。

これはデフォルトのモードです。

マージオンリード

このモードは書き込み速度を優先し、読み込み時間に若干の影響を与えます。

更新、削除、またはマージ操作を実行すると、計算エンジンは変更された行のみの情報を含む削除ファイルを作成します。

テーブルから読み込むと、クエリエンジンは削除ファイルとデータファイルをマージします。マージすると読み取り時間が長くなります。しかし、コンパクションやテーブルのメンテナンスを定期的にスケジュールすることで、読み取りパフォーマンスを最適化することができます。

Icebergの行レベルの変更に関する情報は、Apache Icebergドキュメントの 行レベル削除 をご参照ください。

考慮事項と制約

外部管理Icebergテーブルで行レベル削除を使用する場合は、以下の点を考慮してください。

  • Snowflake は 位置の削除 のみをサポートしています。

  • 行レベル削除を使用する際に最高の読み取りパフォーマンスを得るには、定期的にコンパクションとテーブル・メンテナンスを行い、古い削除ファイルを削除してください。詳細については、 外部カタログを使用するテーブルの維持 をご参照ください。

  • 行レベル削除を使用する場合、以下の機能は現在サポートされていません。

    • 自動リフレッシュ

    • 動的テーブル、動的 Iceberg テーブル、または既存の位置が削除された Iceberg テーブルに対するマテリアライズド・ビュー、検索最適化、またはストリームの作成。

    • 動的テーブル

    • 動的テーブル、動的 Iceberg テーブル、またはアクティブまたは削除されたマテリアライズド・ビュー、検索最適化、またはストリームを持つ Iceberg テーブルの位置削除による Iceberg スナップショットのリフレッシュ。

    • 検索最適化

    • ストリーム

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

外部カタログを使用するIcebergテーブルに対してメンテナンス操作を実行できます。

メンテナンス操作は以下の通り:

  • 期限切れ間近のスナップショット

  • 古いメタデータファイルの削除

  • データファイルのコンパクト化

重要

Icebergテーブルを外部の変更と同期させるためには、Snowflakeのリフレッシュスケジュールをテーブルのメンテナンスに合わせることが重要です。メンテナンス操作を実行するたびに、 テーブルをリフレッシュ します。

Snowflakeで管理されていないIcebergテーブルのメンテナンスについては、Apache Icebergドキュメントの メンテナンス をご参照ください。

テーブルのメタデータをリフレッシュする

外部Icebergカタログを使用する場合、 ALTER ICEBERG TABLE ... REFRESH コマンドを使用してテーブル メタデータをリフレッシュできます。テーブルのメタデータを更新すると、メタデータが最新のテーブルの変更と同期されます。

注釈

サポートされている外部管理テーブルに対して、 自動リフレッシュ を設定することをお勧めします。

テーブルのメタデータを更新する

以下の例では、外部カタログ(AWS Glueまたはデルタなど)を使用するテーブルのメタデータを手動で更新しています。テーブルをリフレッシュすると、リモートカタログで発生した変更とテーブルが同期されます。

この型のIcebergテーブルでは、コマンドでメタデータファイルのパスを指定しません。

ALTER ICEBERG TABLE my_iceberg_table REFRESH;
Copy

テーブルを自動的に更新するには、 自動更新 を設定します。 ALTER ICEBERG TABLE コマンドを使用します。

例:

ALTER ICEBERG TABLE my_iceberg_table SET AUTO_REFRESH = TRUE;
Copy

Icebergファイルから作成されたテーブルのメタデータを更新する

次の例では、外部クラウドストレージの場所にある Icebergメタデータファイル から作成されたテーブルを、先頭スラッシュ(/)なしでメタデータファイルへの相対パスを指定して手動でリフレッシュします。メタデータファイルは、更新後のテーブルのデータを定義します。

ALTER ICEBERG TABLE my_iceberg_table REFRESH 'metadata/v1.metadata.json';
Copy

ストレージメトリックの取得

Snowflakeでは、Icebergテーブルの保管コストをお客様のアカウントに請求することはありません。しかし、 Snowflake Information Schema スキーマまたは Account Usage スキーマの TABLE_STORAGE_METRICS ビューと TABLES ビューをクエリすることで、Icebergテーブルがどれだけのストレージを使用しているかを追跡することができます。

次の例のクエリは、 ACCOUNT_USAGE.TABLE_STORAGE_METRICS ビューと ACCOUNT_USAGE.TABLES ビューを結合し、 TABLES.IS_ICEBERG 列でフィルタリングします。

SELECT metrics.* FROM
  snowflake.account_usage.table_storage_metrics metrics
  INNER JOIN snowflake.account_usage.tables tables
  ON (
    metrics.id = tables.table_id
    AND metrics.table_schema_id = tables.table_schema_id
    AND metrics.table_catalog_id = tables.table_catalog_id
  )
  WHERE tables.is_iceberg='YES';
Copy