レガシーUniFormアイスバーグコンパットV1
このドキュメントは廃止されており、更新されない可能性があります。 このコンテンツに記載されている製品、サービス、またはテクノロジはサポートされなくなりました。 Deltaクライアントを使用したテーブルの読み取りIcebergを参照してください。
プレビュー
この機能は、Databricks Runtime 13.2 以降で パブリック プレビュー 段階です。
Delta Universal Format (UniForm) を使用すると、Iceberg リーダー クライアントで Delta テーブルを読み取ることができます。
UniFormは、Delta LakeとIcebergの両方がParquetデータファイルとメタデータレイヤーで構成されているという事実を利用しています。 UniFormは、データを書き換えることなく、Icebergメタデータを非同期で自動的に生成するため、IcebergクライアントはDeltaテーブルをIcebergテーブルのように読み取ることができます。 データファイルの 1 つのコピーで両方の形式に対応します。
Unity Catalog が Iceberg カタログとして機能するように外部接続を構成できます。 「Unity Catalog Iceberg カタログ エンドポイントを使用して読み取る」を参照してください。
UniForm メタデータの生成は、 Delta テーブルにデータを書き込むために使用されるコンピュートで非同期的に実行されるため、ドライバー リソースの使用量が増加する可能性があります。
必要条件
UniFormを有効にするには、次の要件を満たす必要があります。
- Delta テーブルは Unity Catalog に登録する必要があります。 管理テーブルと外部テーブルの両方がサポートされています。
- テーブルでは、列マッピングが有効になっている必要があります。 「Delta Lake 列マッピングを使用した列の名前変更と削除」を参照してください。
- Delta テーブルには、
minReaderVersion
>= 2 とminWriterVersion
>= 7 が必要です。 「Databricks で Delta Lake 機能の互換性を管理する方法」を参照してください。 - テーブルへの書き込みには、Databricks Runtime 13.2 以降を使用する必要があります。
Delta UniFormを有効にする
Delta UniForm を有効にすると、Delta テーブル機能 IcebergCompatV1
(書き込みプロトコル機能) が設定されます。 このテーブル機能をサポートするクライアントのみが UniForm 対応テーブルに書き込むことができます。 この機能が有効になっている Delta テーブルに書き込むには、Databricks Runtime 13.2 以降を使用する必要があります。
UniForm をオフにするには、 delta.universalFormat.enabledFormats
table プロパティの設定を解除します。 列マッピングを有効にした後でオフにすることはできず、Delta Lake リーダーおよびライター プロトコル バージョンへのアップグレードを元に戻すことはできません。
次のテーブル プロパティは、Iceberg の UniForm サポートを有効にします。 iceberg
のみが有効な値です。
'delta.universalFormat.enabledFormats' = 'iceberg'
また、 UniForm を使用するには、列マッピング と IcebergCompatV1
を有効にする必要があります。 これらは、次の例のように、テーブルの作成時に UniForm を有効にすると自動的に設定されます。
CREATE TABLE T(c1 INT) TBLPROPERTIES(
'delta.universalFormat.enabledFormats' = 'iceberg');
CTAS ステートメントを使用して新しいテーブルを作成する場合は、次の例のように、カラムマッピングを手動で指定する必要があります。
CREATE TABLE T
TBLPROPERTIES(
'delta.columnMapping.mode' = 'name',
'delta.universalFormat.enabledFormats' = 'iceberg')
AS
SELECT * FROM source_table;
既存のテーブルを変更する場合は、次の例のように、これらのプロパティをすべて指定する必要があります。
ALTER TABLE T SET TBLPROPERTIES(
'delta.columnMapping.mode' = 'name',
'delta.enableIcebergCompatV1' = 'true',
'delta.universalFormat.enabledFormats' = 'iceberg');
UniForm を初めて有効にすると、非同期メタデータの生成が開始されます。 このタスクは、外部クライアントが Iceberg を使用してテーブルをクエリする前に完了する必要があります。 「Iceberg メタデータの生成ステータスの確認」を参照してください。
BigQuery を Iceberg リーダー クライアントとして使用する予定の場合は、データ レイアウトの BigQuery 要件に対応するために、Databricks で spark.databricks.delta.write.dataFilesToSubdir
を true
に設定する必要があります。
制限事項を参照してください。
UniFormはいつIcebergメタデータを生成しますか?
DatabricksIcebergDelta Lake 書き込みトランザクションが完了した後に、Delta トランザクションを完了したのと同じコンピュートを使用してメタデータの生成を非同期的にトリガーします。Iceberg メタデータの生成を手動でトリガーすることもできます。 「 Iceberg メタデータ変換を手動でトリガーする」を参照してください。
Icebergメタデータの生成に関連する書き込みレイテンシーを回避するために、頻繁にコミットするDeltaテーブルでは、複数のDeltaコミットを 1 つのIcebergコミットにバンドルできます。
Delta Lake は、常に 1 つの Iceberg メタデータ生成プロセスのみが進行中であることを保証します。 2 番目の並列 Iceberg メタデータ生成プロセスをトリガーするコミットは、 Deltaに正常にコミットされますが、非同期の Iceberg メタデータ生成はトリガーされません。 これにより、コミットが頻繁に行われるワークロード (コミット間の数秒から数分) のメタデータ生成のレイテンシが連鎖的に発生するのを防ぐことができます。
Delta テーブルと Iceberg テーブルのバージョンを参照してください。
Iceberg メタデータの生成ステータスを確認する
UniForm は、メタデータの生成ステータスを追跡するために、Unity Catalog と Iceberg テーブルのメタデータに次のフィールドを追加します。
メタデータフィールド | 説明 |
---|---|
| Iceberg メタデータが正常に生成された Delta テーブルの最新バージョン。 |
| Iceberg メタデータが正常に生成された最新の Delta コミットのタイムスタンプ。 |
Databricks では、カタログ エクスプローラーを使用してこれらのメタデータ フィールドを確認できます。 これらのフィールドと値は、 REST API を使用してテーブルを取得するときにも返されます。
Databricks の外部でテーブル プロパティを確認する方法については、Iceberg リーダー クライアントのドキュメントを参照してください。 OSS Apache Spark の場合、これらのプロパティは次の構文を使用して表示できます。
SHOW TBLPROPERTIES <table-name>;
Icebergメタデータ変換を手動でトリガーする
最新バージョンの Delta テーブルの Iceberg メタデータ生成を手動でトリガーできます。 この操作は同期的に実行されるため、完了すると、Iceberg で使用可能なテーブルの内容には、変換プロセスの開始時に使用可能な最新バージョンの Delta テーブルが反映されます。
この操作は、通常の状態では必要ありませんが、次の問題が発生した場合に役立ちます。
- クラスターは、自動メタデータ生成が成功する前に終了します。
- エラーまたはジョブの失敗により、メタデータの生成が中断されます。
- UniForm Iceberg メタデータ gneration をサポートしていないクライアントは、Delta テーブルに書き込みます。
次の構文を使用して、Iceberg メタデータの生成を手動でトリガーします。
MSCK REPAIR TABLE <table-name> SYNC METADATA
REPAIR TABLEを参照してください。
メタデータ JSON パスを使用した読み取り
一部の Iceberg クライアントでは、外部の Iceberg テーブルを登録するために、バージョン管理されたメタデータ ファイルへのパスを指定する必要があります。 UniForm は、新しいバージョンの Delta テーブルを Iceberg に変換するたびに、新しいメタデータ JSON ファイルを作成します。
Iceberg の構成にメタデータ JSON パスを使用するクライアントには、BigQuery が含まれます。 設定の詳細については、Iceberg リーダークライアントのドキュメントを参照してください。
Delta Lake は、次のパターンを使用して、Iceberg メタデータをテーブル ディレクトリの下に格納します。
<table-path>/metadata/<version-number>-<uuid>.metadata.json
このファイルのパスは、カタログエクスプローラを使用して検索できます。 UniForm が有効になっているテーブルの場合、Delta テーブルの詳細には Iceberg メタデータの場所のフィールドが含まれます。
また、REST API を使用して、メタデータの場所など、テーブルのすべての詳細を取得することもできます。 次のコマンドを使用します。
GET api/2.1/unity-catalog/tables/<catalog-name>.<schame-name>.<table-name>
応答には、次の情報が含まれます。
{
...
"delta_uniform_iceberg": {
"metadata_location": "<cloud-storage-uri>/metadata/v<version-number>-<uuid>.metadata.json"
}
}
パスベースの Iceberg リーダー クライアントでは、現在のテーブル バージョンを読み取るために、メタデータの JSON パスを手動で更新および更新する必要がある場合があります。 Parquet データ ファイルが Delta テーブルから VACUUM
で削除されるため、古いバージョンを使用して Iceberg テーブルをクエリすると、エラーが発生する可能性があります。
Unity Catalog Iceberg カタログ エンドポイントを使用して読み取る
一部の Iceberg クライアントは、Iceberg REST カタログに接続できます。 Unity Catalog は、エンドポイント /api/2.1/unity-catalog/iceberg
を使用して UniForm が有効になっている Delta テーブル用の Iceberg REST カタログ API の読み取り専用実装を提供します。 この REST API の使用の詳細については、 Iceberg REST API の仕様 を参照してください。
Iceberg カタログ API をサポートすることがわかっているクライアントには、Apache Spark、Flink、Trino などがあります。 UniForm を有効にした Delta テーブルを含む基盤となるクラウドオブジェクトストレージへのアクセスを設定する必要があります。 構成の詳細については、Iceberg リーダー クライアントのドキュメントを参照してください。
Databricks の個人用アクセス トークンを生成して構成し、他のサービスが Unity Catalog に接続できるようにする必要があります。 「Databricks リソースへのアクセスの承認」を参照してください。
以下は、UniForm を Iceberg として読み取るように OSS Apache Spark を設定する設定の例です。
"spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions",
"spark.sql.catalog.unity"="org.apache.iceberg.spark.SparkCatalog",
"spark.sql.catalog.unity.catalog-impl": "org.apache.iceberg.rest.RESTCatalog",
"spark.sql.catalog.unity.uri": "<api-root>/api/2.1/unity-catalog/iceberg",
"spark.sql.catalog.unity.token":"<your_personal_access_token>",
"spark.sql.catalog.unity.io-impl": "org.apache.iceberg.aws.s3.S3FileIO
<api-root>
は、個人用アクセストークンを生成したワークスペースの完全な URL に置き換えます。
この方法を使用して Unity Catalog でテーブルに対してクエリを実行する場合、オブジェクト識別子は次のパターンを使用します。
unity.<catalog-name>.<schema-name>.<table-name>
このパターンでは、Unity Catalog と同じ 3 層の名前空間を使用しますが、 unity
というプレフィックスが追加されます。
Delta テーブルと Iceberg テーブルのバージョン
Delta Lake と Iceberg の両方で、テーブルバージョンまたはテーブルメタデータに保存されているタイムスタンプを使用したタイムトラベルクエリを使用できます。
一般に、Iceberg テーブルと Delta テーブルのバージョンは、コミットのタイムスタンプまたはバージョン ID によって整合されません。 特定のバージョンの Iceberg テーブルが対応する Delta テーブルのバージョンを確認する場合は、Iceberg テーブルで設定された対応するテーブル プロパティを使用できます。 「Iceberg メタデータの生成ステータスの確認」を参照してください。
制限
次の制限があります。
- UniFormは、削除ベクトルが有効になっているテーブルでは機能しません。 削除ベクトルとはを参照してください。
- UniForm が有効になっている Delta テーブルでは、
LIST
、MAP
、VOID
の各型はサポートされていません。 - Iceberg クライアントは UniForm からのみ読み取ることができます。 書き込みはサポートされていません。
- Iceberg リーダーのクライアントには、UniForm に関係なく、個別の制限がある場合があります。 選択したクライアントのドキュメントを参照してください。
- Iceberg リーダー クライアント バージョン 1.2.0 以下は、Apache Spark によって書き込まれ
INT96
タイムスタンプ タイプをサポートしていません。 この制限を回避するには、UniForm テーブルに書き込むノートブックで次のコードを使用します。spark.conf.set(“spark.sql.parquet.outputTimestampType”, “TIMESTAMP_MICROS”)
- Unity Catalog Iceberg エンドポイントのパブリック プレビュー バージョンは、大規模な本番運用ワークロード向けではありません。1 秒あたり 5 クエリのしきい値を超えると、レート制限が発生する可能性があります。
次の Delta Lake 機能は、UniForm が有効になっている場合に Delta クライアントで機能しますが、Iceberg ではサポートされていません。
- データフィードを変更
- Delta Sharing