Skip to content
Core Concepts Last updated: May 14, 2026

Iceberg Table Properties

Iceberg table properties are key-value configuration settings stored in the table metadata that control write behavior, file format, partitioning defaults, snapshot retention, delete strategies, and performance tuning parameters for Apache Iceberg tables.

iceberg table propertiesiceberg tblpropertiesiceberg configurationiceberg table settingsiceberg write properties

Iceberg Table Properties

Table properties in Apache Iceberg are key-value configuration settings stored in the table’s metadata file (metadata.json) under the properties map. They control a wide range of table behaviors — from write format and compression to snapshot retention policy and DML write modes — without requiring changes to the underlying data files.

Table properties are set at table creation or modified at any time using ALTER TABLE ... SET TBLPROPERTIES.

Setting Table Properties

-- At creation
CREATE TABLE db.orders (order_id BIGINT, total DOUBLE)
USING iceberg
TBLPROPERTIES (
  'write.format.default' = 'parquet',
  'write.parquet.compression-codec' = 'zstd',
  'write.target-file-size-bytes' = '268435456'
);

-- After creation
ALTER TABLE db.orders SET TBLPROPERTIES (
  'write.delete.mode' = 'merge-on-read',
  'history.expire.max-snapshot-age-ms' = '604800000'
);

-- Unset a property
ALTER TABLE db.orders UNSET TBLPROPERTIES ('write.delete.mode');

Key Table Property Categories

Write Format Properties

PropertyValuesDescription
write.format.defaultparquet, orc, avroDefault data file format
write.parquet.compression-codecsnappy, zstd, gzip, noneParquet compression
write.parquet.row-group-size-bytesbytesParquet row group size
write.parquet.page-size-bytesbytesParquet page size
write.target-file-size-bytesbytesTarget data file size (default 512MB)

DML Write Mode Properties

PropertyValuesDescription
write.delete.modecopy-on-write, merge-on-readMode for DELETE operations
write.update.modecopy-on-write, merge-on-readMode for UPDATE operations
write.merge.modecopy-on-write, merge-on-readMode for MERGE operations

Snapshot Retention Properties

PropertyValuesDescription
history.expire.max-snapshot-age-msmillisecondsAuto-expire snapshots older than this
history.expire.min-snapshots-to-keepintegerMin snapshots to retain regardless of age

Sort Order Properties

PropertyValuesDescription
write.distribution-modenone, hash, rangeHow to distribute data across writers
write.wap.enabledtrue, falseEnable Write-Audit-Publish mode

Metadata Properties

PropertyValuesDescription
write.metadata.delete-after-commit.enabledtrue, falseDelete old metadata files after commit
write.metadata.previous-versions-maxintegerMax old metadata versions to keep
commit.retry.num-retriesintegerNumber of commit retries on conflict
commit.retry.min-wait-msmillisecondsMin wait between retries

Spec v2 / Delete-specific Properties

PropertyValuesDescription
format-version1, 2Iceberg spec version for the table
write.delete.distribution-modenone, hash, rangeDelete file distribution

Common Configuration Recipes

High-Throughput Streaming Table (MoR)

TBLPROPERTIES (
  'write.format.default' = 'parquet',
  'write.parquet.compression-codec' = 'zstd',
  'write.delete.mode' = 'merge-on-read',
  'write.update.mode' = 'merge-on-read',
  'write.merge.mode' = 'merge-on-read',
  'write.target-file-size-bytes' = '134217728',  -- 128MB (smaller for streaming)
  'history.expire.max-snapshot-age-ms' = '86400000'  -- 1 day
)

BI-Serving Aggregation Table (CoW)

TBLPROPERTIES (
  'write.format.default' = 'parquet',
  'write.parquet.compression-codec' = 'zstd',
  'write.delete.mode' = 'copy-on-write',
  'write.update.mode' = 'copy-on-write',
  'write.merge.mode' = 'copy-on-write',
  'write.target-file-size-bytes' = '268435456',  -- 256MB
  'history.expire.max-snapshot-age-ms' = '604800000'  -- 7 days
)

Compliance Table (Long Retention)

TBLPROPERTIES (
  'history.expire.max-snapshot-age-ms' = '7776000000',   -- 90 days
  'history.expire.min-snapshots-to-keep' = '30',
  'write.delete.mode' = 'merge-on-read'
)

Viewing Current Table Properties

-- Spark
SHOW TBLPROPERTIES db.orders;

-- PyIceberg
table = catalog.load_table("db.orders")
print(table.properties)

-- Output: dict of all current property key-value pairs

Engine-Specific vs. Standard Properties

Some table properties are standard Iceberg spec properties (respected by all engines). Others are engine-specific hints:

Standard properties should be preferred for maximum portability across engines.

📚 Go Deeper on Apache Iceberg

Alex Merced has authored three hands-on books covering Apache Iceberg, the Agentic Lakehouse, and modern data architecture. Pick up a copy to master the full ecosystem.

← Back to Iceberg Knowledge Base