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';
次に、 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 = 'my/relative/path/from/external_volume';
注釈
この例では、テーブルがオブジェクトストレージの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ではソースデータ型がサポートする範囲外の値を挿入することはできません。詳細については、 近似一致型 をご参照ください。