注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
Iceberg テーブルのメタデータには、テーブルプロパティのキーと値のマップが含まれます。テーブルプロパティの初期マップはテーブルの作成時に設定され、その後は ALTER TABLE ... SET TBLPROPERTIES を使用して変更できます。Iceberg 仕様では主要なプロパティのキーが予約されており、Foundry もテーブルの RID など、Foundry 固有のメタデータを追跡するためのキーを提供しています。
Foundry 固有のプロパティには、次のものがあります。
| プロパティ | 説明 | ユーザーによる編集 |
|---|---|---|
created-at | テーブル作成タイムスタンプ(カタログ共通の規約) | ✅ 許可 |
foundry.branch.* | ブランチ単位のスキーマ、パーティション仕様、並べ替え順序を追跡 | ❌ 不許可 |
foundry.rid | テーブルの RID | ❌ 不許可 |
foundry.table-version | カタログ内部のマーカー | ❌ 不許可 |
Iceberg 仕様でも、中核となる Iceberg テーブルプロパティ ↗が予約されています。
Foundry の Iceberg REST カタログでは、特定の中核的な Iceberg テーブルプロパティに次の制約が設けられています。
| プロパティ | Foundry のデフォルト値 | ユーザーによる編集 |
|---|---|---|
encryption.* | 有効な場合、Iceberg テーブルの暗号化の一環として設定 | ❌ 不許可 |
format-version | フォーマットバージョンのデフォルト値を参照 | ✅ 許可 |
history.expire.max-snapshot-age-ms | 2592000000(30日) | ✅ 許可 |
write.metadata.delete-after-commit.enabled | false | ❌ 不許可 |
write.metadata.previous-versions-max | 1 | ✅ 許可 |
write.object-storage.enabled | true | ❌ 不許可 |
write.object-storage.partitioned-paths | false | ❌ 不許可 |
write.data.path | ❌ 不許可 | |
write.folder-storage.path | ❌ 不許可 | |
write.location-provider.impl | ❌ 不許可 | |
write.metadata.path | ❌ 不許可 | |
write.object-storage.path | ❌ 不許可 |
Foundry がデフォルト値を提供している場合、その値がオープンソースの Iceberg 仕様のデフォルト値よりも優先されます。明示的に設定されていないプロパティには、Iceberg 仕様のデフォルト値が使用されます。
Foundry が適用するデフォルト設定は変更される可能性があります。特定のプロパティ値を確実に使用するには、以下の説明に従って、テーブルにそれらの値を明示的に設定してください。
特定のテーブルプロパティは手動で設定できます。たとえば、Iceberg のメンテナンスページで ALTER TABLE 文を実行するか、トランスフォームのコード内でプロパティを指定します。
以下は、トランスフォームでテーブルプロパティを設定するコードスニペットの例です。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18import polars as pl from transforms.api import transform from transforms.tables import IcebergOutput, TableOutput @transform.using(output=TableOutput("/path/table")) def compute(output: IcebergOutput) -> None: df_custom = pl.DataFrame({"phrase": ["Hello", "World"]}) output.write_table(df_custom) tbl = output.iceberg().table() with tbl.transaction() as txn: txn.set_properties({ "write.delete.mode": "merge-on-read", "write.update.mode": "merge-on-read", "write.merge.mode": "merge-on-read", "history.expire.max-snapshot-age-ms": "0", })
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28from transforms.api import TransformContext from transforms.api import transform from transforms.tables import ( TableOutput, TableTransformOutput, ) @transform( output=TableOutput("/path/table") ) def compute(ctx: TransformContext, output: TableTransformOutput): spark = ctx.spark_session df_custom = spark.createDataFrame([["Hello"], ["World"]], schema=["phrase"]) output.write_dataframe(df_custom) identifier = output.identifier spark.sql(f""" ALTER TABLE {identifier} SET TBLPROPERTIES ( "write.delete.mode": "merge-on-read", "write.update.mode": "merge-on-read", "write.merge.mode": "merge-on-read", 'history.expire.max-snapshot-age-ms' = '0' ) """)
テーブルプロパティは、出力テーブルを書き込んだ後にのみ設定してください。これにより、プロパティを設定する前にテーブルが存在することが保証され、Spark の write_dataframe が実行する置換操作によって、指定したプロパティ値がデフォルト値で上書きされるのを防ぎます。