Icebergテーブルの変換

このトピックでは、Snowflakeで管理されていない Icebergテーブル を、IcebergカタログとしてSnowflakeを使用するテーブルに変換する方法についての情報を提供します。

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

Icebergテーブルを変換する前に、SnowflakeがサポートするさまざまなIcebergカタログオプションについて熟知しておくことをお勧めします。詳細については、 Icebergカタログのオプション をご参照ください。

テーブル変換前と変換後

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

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

変換前

変換後

Icebergカタログ

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

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

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

Snowflakeの読み取り操作

Snowflakeの書き込み操作

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

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

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

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

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

Snowflakeは、外部で生成されたデータやメタデータファイルには一切触れません。

Snowflake Icebergカタログ 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 権限がある必要があります。

例: Icebergテーブルの変換

この例では、まずオブジェクトストレージ内の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 = myBaseLocation;
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/ に書き込みます。

変換とデータ型

Snowflakeがサポートして いない Icebergデータ型を持つテーブルを変換した場合、Snowflakeは Snowflakeデータ型 を使用して値を処理して返します。しかし、SnowflakeはオリジナルのIcebergデータ型をテーブルデータファイルに書き込むため、Apache Sparkのような他のコンピュートエンジンでテーブルを使用することができます。

intlong などのデータ型の場合、Snowflakeが処理に使用するデータ型は、ソースデータ型よりも大きな値の範囲をサポートします。ソースデータ型との一貫性を保つため、Snowflakeではソースデータ型がサポートする範囲外の値を挿入することはできません。

例えば、Iceberg型 int の列を持つテーブルを考えてみましょう。変換後、SnowflakeはSnowflakeデータ型 NUMBER(10,0)を使用して列の値を処理します。NUMBER(10,0)の範囲は(-9,999,999,999,+9,999,999,999)ですが、 int の範囲はさらに制限された(-2,147,483,648,+2,147,483,647)です。その列に3,000,000,000の値を挿入しようとすると、Snowflakeは範囲外のエラーメッセージを返します。

制限などのデータ型の詳細については、 Icebergテーブルのデータ型 をご参照ください。