Compatibility and limits¶
This page collects what iceberg-ops 0.1 supports, what it has been tested with, and where its boundaries are. The guides link here instead of repeating the details.
Python and dependencies¶
Requirement |
Range |
Notes |
|---|---|---|
Python |
3.12 or later |
CI tests 3.12, 3.13 and 3.14 on Linux and 3.12 on Windows, plus one run at the lowest declared dependency versions. Python 3.15 is not tested; at release time PyIceberg 0.12.0 published no Python 3.15 wheels. |
PyIceberg |
|
Every catalog extra uses the same range. |
PyArrow |
|
iceberg-ops does not use NumPy, but PyArrow 26 and later refuse
to import next to NumPy 1.x. In an environment pinned to NumPy
1.x, also pin |
Click |
|
The CLI. |
PyYAML |
|
Reads |
tzdata |
Windows only |
Windows ships no time-zone database; |
Extras¶
Extra |
Installs |
Needed for |
|---|---|---|
|
|
The local SQLite catalog and the in-memory catalog. |
|
|
AWS Glue catalogs. |
|
|
Hive Metastore catalogs. |
|
|
AWS S3 Tables (REST with SigV4 signing; brings boto3). |
|
|
Writing data to tables partitioned by bucket, truncate, year,
month, day or hour transforms (for example with
|
|
|
The experimental Apache Polaris policy client. |
|
nothing beyond the core install |
Accepted as aliases. PyIceberg’s REST client and PyYAML are part of the core install. |
docs and dev are for contributors; see
CONTRIBUTING.md.
Catalogs¶
The Python API accepts any PyIceberg Catalog instance, and
CatalogFactory.build is a convenience for the kinds below. The CLI
selects a catalog with --catalog or --catalog-name (see
CLI Reference).
Catalog |
Python API |
CLI |
Tested |
|---|---|---|---|
SQLite (local file) |
|
|
Integration-tested |
In-memory |
|
Not accepted: its state is gone when the command exits |
Integration-tested (the test suite’s default catalog) |
REST (Apache Polaris, Nessie, Lakekeeper, …) |
|
|
Through PyIceberg; not tested against a live server |
AWS Glue |
|
|
Through PyIceberg; not tested against the live service |
Hive Metastore |
|
|
Through PyIceberg; not tested against a live metastore |
AWS S3 Tables |
|
|
Through PyIceberg; not tested against the live service |
Other PyIceberg catalog types |
|
|
|
How the CLI finds a catalog:
--catalog-name NAME(orcatalog_name:iniceberg-ops.yaml) callspyiceberg.catalog.load_catalog(NAME). Its properties come from.pyiceberg.yaml(PyIceberg looks in$PYICEBERG_HOME, then the home directory, then the current directory, and uses the first file it finds) and fromPYICEBERG_CATALOG__<NAME>__<KEY>environment variables. In variable names_stands for-, so the catalogmy-catreadsPYICEBERG_CATALOG__MY_CAT__URI.--catalog glue,rest,hiveors3tablesloads the catalog named after the kind the same way, soPYICEBERG_CATALOG__REST__URIconfigures--catalog rest.--warehousesets thewarehouseproperty;--db-pathapplies tosqliteonly.migrate-dataandrun-policiestake their own catalog options; the catalog settings iniceberg-ops.yamldo not apply to them.
Migration history is a table in the _iceberg_ops namespace of the
managed catalog, created on the first write. The Python API can use
another namespace through MigrationRunner(meta_namespace=...); the
CLI always uses _iceberg_ops, so a catalog that rejects that
namespace name needs the Python API.
Filesystems¶
Schema migrations are metadata operations and go through PyIceberg’s file IO, so they work wherever PyIceberg can read and write the table’s metadata. Two maintenance helpers walk or rewrite files themselves and support the local filesystem only:
Helper |
|
|
|---|---|---|
|
yes |
not tested (reads metadata only) |
|
yes |
not tested (metadata only; data files stay on storage) |
|
yes |
no ( |
|
yes |
no ( |
See Storage Maintenance for each helper’s behaviour.
Format versions, delete files and deletion vectors¶
Every write iceberg-ops performs (history rows, compaction, data migration, upserts) goes through PyIceberg and is copy-on-write. iceberg-ops never writes position-delete files, equality-delete files or deletion vectors.
compact_small_files_streamingdoes not support tables that already contain delete files or deletion vectors, and it does not check for them. Do not run it on such tables.remove_orphan_fileskeeps every file the table metadata references, including delete files, deletion-vector Puffin files and statistics files.table_health_reportdoes not account for delete files.Format version 3 features are handled only as far as PyIceberg 0.12 supports them. iceberg-ops adds no v3-specific handling and has no v3 tests.
Concurrency¶
Concurrent runs against one namespace are not guarded: run one migration
job per namespace at a time, for example one CI job or a concurrency
group in your orchestrator. If two migrate runs overlap, both can
execute upgrade(); the second one to record history raises
ConcurrentMigrationError, and the history keeps one row per version
and namespace. Because that run’s upgrade() may already have run,
keep upgrade() idempotent. Runners for different namespaces can
share the history table. See Schema Migrations for the details.
A data-migration checkpoint file belongs to one job; do not share it
between concurrent runs. A concurrent append to a partition being
compacted fails the run with ValidationException and the staged
files are removed. PyIceberg retries the commit after appends to other
partitions; those appends are preserved and counted in
files_after.
Experimental and frozen modules¶
iceberg-ops is Alpha (0.x). Any minor release before 1.0 may change the Python API, CLI options and the history-table or checkpoint layouts; the changelog lists breaking changes.
Module |
Status |
Scope |
|---|---|---|
Migrations ( |
Alpha |
The focus of development. |
|
Experimental |
Documented fences in Cross-Table Data Migration:
|
|
Basic, frozen |
Helpers for self-managed tables on the local filesystem; bug fixes only. See Storage Maintenance. |
|
Experimental |
Executes |
|
May change |
Test doubles for the Polaris client. |
Upstream PyIceberg issues¶
Issue |
Effect and what iceberg-ops does |
|---|---|
On PyIceberg 0.12 a concurrent |
|
A composite-key upsert with a few thousand keys can crash the interpreter. iceberg-ops splits larger composite-key batches into sub-batches of 1,000 keys inside one commit. |
|
The first upsert after a schema-only change fails. The data
migrator and |
|
PyIceberg’s batch reader decodes whole files, so peak memory in compaction and data migration grows with the number and size of source files. iceberg-ops does not work around this. |
Windows¶
tzdatais installed automatically.Write a local warehouse in
.pyiceberg.yamlasfile://C:/path/to/warehouse; PyArrow rejects thefile:///C:/...form. The built-insqlitekind builds its warehouse URI in thefile://C:...form for you. Other engines may expect a different spelling of a local Windows path, so a table written this way may not open elsewhere.