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)コマンド をサポートしています。

また、 COPY INTO <テーブル> または Snowpipe を使用して、Snowflakeが管理するテーブルにデータを一括コピーすることもできます。

例: テーブルの更新

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は、テーブルの作成時に BASE_LOCATION パラメーターで指定した場所にある外部ボリュームの 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テーブルに対してメンテナンス操作を実行できます。

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

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

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

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

重要

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

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

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

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

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

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

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

ALTER ICEBERG TABLE my_iceberg_table REFRESH;
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