Snowflakeをカタログとして使用するように Apache Iceberg™ テーブルを変換する

Snowflakeが管理していない Apache Iceberg™テーブル を、IcebergカタログとしてSnowflakeを使用するテーブルに変換します。

Snowflakeカタログ SDK のサポートなど、Snowflakeプラットフォームの完全なサポートが必要な場合、テーブルを変換することを選択するかもしれません。

Icebergテーブルのタイプの違いについては カタログオプション をご参照ください。

テーブル変換前と変換後

IcebergテーブルをSnowflakeをカタログとして使用するように変換すると、そのテーブルは書き込み可能になり、Snowflakeがそのテーブルのライフサイクル管理を引き受けます。

次の表は、変換前と変換後のIcebergテーブルを比較しています。

変換前

変換後

Icebergカタログ

外部カタログ(AWS Glueなど)、またはカタログをまったく使用しません。カタログ統合が必要です。

Snowflake。Snowflakeはソースデータへの変更を登録し、その変更をSnowflakeカタログに登録します。その後、Snowflakeは外部ボリュームのテーブルメタデータを更新します。

カタログとの統合は不要です。

Snowflakeの読み取り操作

Snowflakeの書き込み操作

テーブルデータとメタデータのストレージの場所

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

指定したベースの場所にある外部ボリューム(外部クラウドストレージ)。

データとメタデータのクリーンアップ

お客様またはお客様の外部カタログによって管理されます。

Snowflakeによって管理されます。Snowflakeは、変換前に作成されたメタデータ、マニフェストリスト、またはマニフェストを外部ストレージから削除しません。変換中にSnowflakeがParquetデータファイルを書き換えることはありません。テーブルを変換した 、Snowflakeは定期的なテーブルメンテナンスの一環としてデータファイルの一部を書き換えることがあります。

Snowflakeカタログ SDK からアクセス可能

重要

Icebergテーブルを変換する際、Snowflakeは外部ストレージへのアクセスをロックすることや、単独でアクセスすることはありません。テーブルの破損を防ぐため、外部ストレージへのSnowflake以外の書き込み(自動メンテナンスジョブなど)を監視または停止してください。

要件

Icebergテーブルを変換する前に、Snowflakeが外部ボリュームに書き込めることを確認してください。

Snowflakeが外部ボリュームに書き込むには、次の条件を満たす必要があります。

  • ALTER ICEBERG TABLE ... REFRESH コマンドを使用して、変換前にテーブルを手動で更新します。

  • 外部ボリュームの ALLOW_WRITES プロパティは TRUE に設定されています。既存の外部ボリュームのこのプロパティの値を更新するには、 ALTER EXTERNAL VOLUME コマンドを使用します。例: ALTER EXTERNAL VOLUME my_ext_vol SET ALLOW_WRITES=TRUE

  • クラウドストレージアカウントに設定するアクセス制御の権限は、書き込みアクセスを許可する必要があります。例えば、Amazon S3用に構成された外部ボリュームを使用する場合、IAM ロールにS3ロケーションの s3:PutObject 権限がある必要があります。

注釈

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

例: テーブルの変換

重要

Icebergテーブルを変換する際、Snowflakeは外部ストレージへのアクセスをロックすることや、単独でアクセスすることはありません。テーブルの破損を防ぐため、外部ストレージへのSnowflake以外の書き込み(自動メンテナンスジョブなど)を監視または停止してください。

この例では、まずオブジェクトストレージ内のIcebergファイルからIcebergテーブルを作成します。Snowflakeは METADATA_FILE_PATH 値を使用して、列定義のために次の場所にあるテーブルメタデータを探します: <ext-vol-storage-base-url>/path/to/metadata/v1.metadata.json

CREATE ICEBERG TABLE myIcebergTable
  EXTERNAL_VOLUME='icebergMetadataVolume'
  CATALOG='icebergCatalogInt'
  METADATA_FILE_PATH='path/to/metadata/v1.metadata.json';
Copy

次に、 ALTER ICEBERG TABLE ... REFRESH コマンドを使用して、テーブルメタデータを最新のメタデータファイルと同期させます。次のコマンド例は、メタデータファイルのパスを指定してテーブルを更新します。

ALTER ICEBERG TABLE myIcebergTable REFRESH 'metadata/v2.metadata.json';
Copy

最後に、 ALTER ICEBERG TABLE ... CONVERT TO MANAGED コマンドを使用して、テーブルをIcebergカタログとしてSnowflakeを使用するように変換します。

ALTER ICEBERG TABLE myIcebergTable CONVERT TO MANAGED
  BASE_LOCATION = 'my/relative/path/from/external_volume';
Copy

注釈

この例では、テーブルがオブジェクトストレージのIcebergファイルから作成され、 BASE_LOCATION が元の CREATE ICEBERG TABLE 文の一部ではなかったため、 ALTER 文は BASE_LOCATION を指定する必要があります。 BASE_LOCATION は、外部ボリュームから、Snowflakeが変換したテーブルのテーブルデータとメタデータを書き込むディレクトリへの相対パスを定義します。

それ以外の場合は、 BASE_LOCATION がオリジナルの CREATE ICEBERG TABLE ステートメントで指定されていた場合、 ALTER ICEBERG TABLE ... CONVERT TO MANAGED コマンドに含める必要はありません。

例えば、Snowflakeはテーブルデータを <ext-vol-storage-base-url>/myBaseLocation/data/ に書き込みます。

Snowflakeは変換されたテーブルのメタデータを <ext-vol-storage-base-url>/myBaseLocation/metadata/ に書き込みます。

変換とデータ型

注釈

次のIcebergデータ型を使用するテーブルは変換できません:

  • uuid

  • fixed(L)

SnowflakeはSnowflakeデータ型を使用して値を処理し返しますが、元のIcebergデータ型をテーブルデータファイルに書き込みます。

int および long などのデータ型では、Snowflakeデータ型はIcebergデータ型よりも大きな値の範囲をサポートしています。ソースデータ型との一貫性を保つため、Snowflakeではソースデータ型がサポートする範囲外の値を挿入することはできません。詳細については、 近似一致型 をご参照ください。