概要
Microsoft Fabric(Fabric)の Iceberg テーブル ショートカットには、「同一ディレクトリ内のメタデータ ファイルのセットは 1 つのみにする必要がある」という制限があります(ドキュメントに下記のとおり記載されています)。本稿では、この制限と、Snowflake の Iceberg テーブルにおける CLONE の動作仕様の関係について実施した検証結果を共有します。
出所: OneLake で Iceberg テーブルを使用する - Microsoft Fabric | Microsoft Learn
Snowflake の Iceberg テーブルで CLONE を実行した場合、同一ディレクトリ内でメタデータが管理されるため、Fabric の Iceberg テーブル ショートカットの変換が動作しなくなる可能性を懸念しました。Snowflake の Iceberg テーブルで CLONE を実行した場合の動作については、下記の記事で記述しています。
https://qiita.com/manabian/items/81983193d9df4b854184
検証結果は下記のとおりです。CLONE を実行したとしても即座にエラーとなるわけではなく、テーブルを再作成した際にはメタデータのバージョンが高いほうが優先される動作を確認しました。
- Clone 実行後、データ挿入の動作確認: Clone 後も Iceberg テーブルのショートカット作成時のメタデータに追随することを確認
- Clone 実行後のテーブルのショートカットを作成: メタデータのバージョンが上の Clone 元テーブルをベースに Iceberg テーブルのショートカットが作成されることを確認
- Clone 先テーブルのメタデータバージョンが高い場合の検証: メタデータのバージョンが上の Clone 先テーブルをベースに Iceberg テーブルのショートカットが作成されることを確認
事前準備
Snowflake と OneLake の接続
https://qiita.com/manabian/items/13e62a8b2477c1346bf3
Snowflake にてテーブルを作成
CREATE DATABASE IF NOT EXISTS ONELAKE_CLONE_01;
CREATE SCHEMA IF NOT EXISTS ONELAKE_CLONE_01.SCHEMA_01;
USE DATABASE ONELAKE_CLONE_01;
USE SCHEMA SCHEMA_01;
CREATE OR REPLACE ICEBERG TABLE SOURCE_TABLE_01 (
ID INT,
NAME STRING,
TS TIMESTAMP_NTZ
)
CATALOG = 'SNOWFLAKE'
EXTERNAL_VOLUME = 'onelake_iceberg_vol_01';
INSERT INTO SOURCE_TABLE_01 (ID, NAME, TS)
VALUES
(1, 'Alice', CURRENT_TIMESTAMP());
Fabric にて Iceberg テーブルのショートカットを作成
スキーマを作成しました。
Iceberg テーブルのショートカットを作成します。
latest_conversion_log.txt を確認すると、変換が正常完了との記載を確認できます。
"Conversion completed successfully at 2026-02-04 05:59:31 UTC time. Latest Metadata file: 00001-b0c03c37-38f5-40be-a878-e8e025b76bf7.metadata.json"
検証
1. Clone 実行後、データ挿入の動作確認
Snowflake にて、Iceberg テーブルから CLONE した Iceberg テーブルを作成します。
CREATE OR REPLACE ICEBERG TABLE cloned__SOURCE_TABLE_01
CLONE SOURCE_TABLE_01;
latest_conversion_log.txt を確認すると、変換が失敗との記載を確認できます。
"Conversion failed at 2026-02-04 06:09:15 UTC time. Latest Metadata file: N/A."
log_dir = "file:/lakehouse/default/Tables/clone_test_01/SOURCE_TABLE_01.vPsduL4t/_delta_log/latest_conversion_log.txt"
print(notebookutils.fs.head(log_dir))
Snowflake にて Clone 元のテーブルにデータを挿入します。
INSERT INTO SOURCE_TABLE_01 (ID, NAME, TS)
VALUES
(2, 'Bob', CURRENT_TIMESTAMP());
Fabric にてテーブルを確認すると、データが追加されており、変換が正常完了との記載を確認できました。
"Conversion completed successfully at 2026-02-04 06:12:06 UTC time. Latest Metadata file: 00002-fb656960-e106-4bc9-86db-2daab68e8c38.metadata.json"
Clone 元テーブルにデータを挿入し、想定どおりにデータが追加されていることを確認できました。
"Conversion completed successfully at 2026-02-04 06:17:28 UTC time. Latest Metadata file: 00003-b5e01725-f637-4a5b-bc2e-7b2a2c6f4b13.metadata.json"
2. Clone 実行後のテーブルのショートカットを作成
この時点では、Clone 元テーブルのメタデータ バージョンが 3、Clone 先テーブルのメタデータ バージョンが 1 の状態です。この状態で、(Clone 先テーブルを参照する)テーブルのショートカットを作成します。
結果として、Clone 元のテーブルのデータが表示されました。
3. Clone 先テーブルのメタデータバージョンが高い場合の検証
Clone 先テーブルのメタデータ バージョンを上げるために、書き込み処理を実施します。
INSERT INTO cloned__SOURCE_TABLE_01 (ID, NAME, TS)
VALUES
(2, 'B', CURRENT_TIMESTAMP());
INSERT INTO cloned__SOURCE_TABLE_01 (ID, NAME, TS)
VALUES
(3, 'C', CURRENT_TIMESTAMP());
INSERT INTO cloned__SOURCE_TABLE_01 (ID, NAME, TS)
VALUES
(4, 'D', CURRENT_TIMESTAMP());
INSERT INTO cloned__SOURCE_TABLE_01 (ID, NAME, TS)
VALUES
(5, 'D', CURRENT_TIMESTAMP());
この時点では、Clone 元テーブルのメタデータ バージョンが 3、Clone 先テーブルのメタデータ バージョンが 4 の状態です。この状態で、(Clone 先テーブルを参照する)テーブルのショートカットを作成します。
結果として、Clone 先のテーブルのデータが表示されました。
























