Icebergテーブルの変換¶
このトピックでは、Snowflakeで管理されていない Icebergテーブル を、IcebergカタログとしてSnowflakeを使用するテーブルに変換する方法についての情報を提供します。
Snowflake Icebergカタログ SDK のサポートなど、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';
次に、 ALTER ICEBERG TABLE ... REFRESH コマンドを使用して、テーブルメタデータを最新のメタデータファイルと同期させます。次のコマンド例は、メタデータファイルのパスを指定してテーブルを更新します。
ALTER ICEBERG TABLE myIcebergTable REFRESH 'metadata/v2.metadata.json';
最後に、ALTER ICEBERG TABLE ... CONVERT TO MANAGED コマンドを使用して、テーブルをIcebergカタログとしてSnowflakeを使用するように変換します。
ALTER ICEBERG TABLE myIcebergTable CONVERT TO MANAGED
BASE_LOCATION = myBaseLocation;
注釈
この例では、テーブルがオブジェクトストレージの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のような他のコンピュートエンジンでテーブルを使用することができます。
int
や long
などのデータ型の場合、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テーブルのデータ型 をご参照ください。