Apache Iceberg Python 0.12.0 Release
The Apache Iceberg community is pleased to announce the 0.12.0 release of Apache Iceberg Python.
The 0.12.0 release covers development work from early February through late August 2026 and is the result of merging over 470 pull requests from 58 contributors, including more than 40 first-time contributors.
These notes cover the highlights. For the full list, see the changelog.
Release Highlights🔗
REST Catalog View Support🔗
This release adds read support for Iceberg views. Views can be created, loaded, listed, registered, and dropped through the REST catalog, and are exposed through a View object.
view = catalog.create_view(
identifier=("default", "recent_orders"),
schema=schema,
view_version=view_version,
)
view = catalog.load_view("default.recent_orders")
view.sql_for("spark")
- ViewMetadata read support and
create_viewfor the REST catalog load_viewand theViewobject API- Registering existing views via
register_view - Pagination support for
list_views - More examples for working with views and a REST integration test suite
For older REST servers that support the view endpoints but do not advertise them in the ConfigResponse, set the view-endpoints-supported catalog property.
Commit Retry and Concurrency Validation🔗
Writes now retry on concurrent commits and validate for conflicts. When a catalog commit fails with CommitFailedException, Transaction.commit_transaction() refreshes the table, checks for conflicts, and retries the commit.
Incremental Append Scan🔗
Table.incremental_append_scan() (#3512) reads the rows added by append snapshots within a snapshot range, projected onto the table's current schema.
scan = table.incremental_append_scan(
from_snapshot_id_exclusive=last_processed_snapshot_id,
to_snapshot_id_inclusive=table.current_snapshot().snapshot_id,
)
new_rows = scan.to_arrow()
Geometry and Geography Types🔗
The v3 geometry and geography primitive types are now supported: schema parsing and serialization, Avro mapping via WKB bytes, and PyArrow/Parquet integration.
File Format Writer API🔗
PyIceberg has begun using the File Format API for handling Parquet files.
Catalog and REST Improvements🔗
- REST
loadCredentialssupport with longest-prefix resolution for a target location, and storage credentials inLoadTableResult - Pagination support for
list_namespacesandlist_tables, with a sharedrest-page-sizeoption overwriteoption forregister_table- SigV4 retry configuration defaults for REST
- S3 server-side encryption configs for
FsspecFileIO - Glue
create_tablesupport for S3 Tables federated databases - An
iceberg_typecolumn forSqlCatalog, so Iceberg tables can be distinguished from other entries, with filtering fixed for existing catalogs - Catalog properties for the shared catalog test suite and coverage for nonexistent tables and namespaces
- Renamed
rest-scan-planning-enabledtoscan-planning-mode
CLI🔗
--warehouseflag for the REST catalog--versionflag, deprecating theversionsubcommand, which now also skips catalog loading--purgeoption fordrop table, to request that the catalog purge the underlying table files
Bug Fixes🔗
Notable correctness fixes in this release:
- Fixed strict
NotEqualTo/NotInpruning for files with partial nulls or NaNs - Corrected
NOT STARTS WITHprojection for truncated partitions, along with residual evaluation and the string-basedstarts_with/not_starts_withmethods - Fixed the
ManifestEntry.snapshot_idsetter writing to the wrong index - Fixed the
DELETEDmanifest entrysnapshot_idinOverwriteFiles - Preserved a manifest min sequence number of 0 rather than dropping it
- Stripped the spec-mandated deletion vector blob framing before deserializing, with a Spark interop test covering the read path
- Fixed
deepcopyforAnd,Or, andNotexpressions - Fixed precision loss in large integral string conversions, with Long bounds returned for decimal conversion, bounds sentinels for long date literals, and an overflow sentinel in
LongLiteral.to(FloatType) - Padded sub-microsecond digits when parsing nanosecond timestamps, and handled non-UTC nanosecond timestamps
- Used minimal byte length when encoding decimals for negative powers of two
- Preserved dictionary encoding in
to_arrow_batch_reader - Fixed
delete_data_fileon partitioned tables and residualNotNaNfor null partition values - Avoided committing update builders after exceptions
- Preserved
write_defaultwhen applying a name mapping - Handled zero-byte files in fsspec
__len__, extracted the ADLSaccount_namefrom the URI hostname, and parsed S3 virtual addressing as a boolean - Stopped reusing
TSaslClientTransportto eliminate server-side SASL noise - Rejected unsupported identity transform types, empty
source-ids, and decimal precision outside the valid range
Breaking Changes🔗
- Raised
pyarrowminimum from 17.0.0 to 18.0.0 for native UUID type support - Bumped
pyiceberg-corefrom>=0.5.1,<0.9.0to>=0.10.1,<0.11.0, which bundles DataFusion 53.x behind a newdatafusionextra NoopCatalog.table_existsnow returnsFalseinstead of raising- Explicitly deleting a data file that's already missing now raises instead of failing silently
Infrastructure Improvements🔗
- Python 3.14 support
- Windows unit test job added to CI
- CodeQL security scanning for GitHub Actions, and a documented Iceberg security model
- Migrated lockfile management to uv-pre-commit with
uv.lockfreshness enforced in CI - Third-party GitHub Actions pinned to Apache-approved SHAs, with an allowlist check on every PR and least-privilege workflow permissions
- Papermill-based tests that execute the documentation examples, and a release verification script
- PR auto-merge enabled
Contributors🔗
$ git shortlog --perl-regexp --author='^((?!dependabot\[bot\]).*)$' -sn pyiceberg-0.11.0..pyiceberg-0.12.0
44 Kevin Liu
36 Yuya Ebihara
12 Anas Khan
11 Alex Stephen
7 geruh
5 Minh Vu
5 Neelesh Salian
4 Gabriel Igliozzi
3 Fokko Driesprong
3 GayathriSrividya
3 Junwang Zhao
3 Sotaro Hikita
3 jj.lee
3 vishnu prakash
2 Aaron Niskode-Dossett
2 ChangHyeon Im
2 David
2 David Dallakyan
2 Jared Yu (余启正)
2 Mrutunjay Kinagi
2 Paul Mathew
2 Sreesh Maheshwar
2 Tanmay Rauth
2 Yingjian Wu
1 Adam
1 Antonio
1 Ben Lai
1 BharatDeva
1 CalebWeisgerber
1 Chris Qiu
1 David Zhao
1 Federico
1 James Bornholt
1 Jared Yu
1 Koen Denecker
1 Kristofer Gaudel
1 Marcin Szymański
1 Ménélik Vero
1 Noritaka Sekiyama
1 Platon G. Gimp
1 Pucheng Yang
1 R. Conner Howell
1 Rob Reeves
1 Ruiyang Wang
1 Sam Verhasselt
1 Sidra
1 Sumanth
1 Sung Yun
1 Thomas Pfeiffer
1 Vova Kot
1 Yong Zheng
1 abnobdoss
1 achasnovskiy
1 antonlin1
1 barking-code
1 committobetter
1 rcjverhoef
1 shiwk
1 spr0els
Getting Involved🔗
The PyIceberg project welcomes contributions! We use GitHub issues for tracking work and the Apache Iceberg Community Slack for discussions.
The easiest way to get started is to:
- Try PyIceberg with your workloads and report any issues you encounter
- Review the contributor guide
- Look for good first issues
Code review is also a very welcome contribution - please provide feedback on pull requests where you feel comfortable to do so!
For more information, visit the PyIceberg repository or the documentation.