Polars py-1.44.0 - Iceberg Scan And Cloud IO


Python Polars tagged py-1.44.0 on 24 August 2026. Native scan_iceberg now handles Iceberg schema evolution, V3 deletion vectors, snapshot properties, and object storage paths. The tag is a stable Python release.

The full release notes and downloads are on the GitHub release page.

scan_iceberg is the native Iceberg reader. This tag adds schema evolution, so a table whose columns drifted can still scan without a manual schema pin at the call site. V3 deletion vectors are applied on that native path. Snapshot properties are readable. Object storage paths are accepted.

Those four items are the lakehouse facing work. If a job already uses the native Iceberg scan against object storage, this is the tag to test on a table that has evolved schema and V3 deletes. The notes do not list which Iceberg spec versions beyond V3 deletes are newly covered. Do not assume full V3 table support from the deletion vector line alone.

sink_parquet exposes sinked_paths_callback as an unstable parameter. Unstable means the name and shape can change. Do not build a production contract on it yet. CSV inference adds infer_schema_files as a hint for schema detection across files.

Parquet scans keep Partial metadata on filter and keep the first metadata block per source. Plan time row estimates for multi file Parquet scans are improved. That is planner input, not a file format change.

Cloud IO adds an adaptive HTTP rate limiter. Default CloudRetryConfig is relaxed so rate limit retries are less aggressive on the default path. A private environment variable can toggle HTTP rate limit behavior. The notes do not name that variable. Treat it as unsupported until it appears in public docs.

Query metrics can be exported to polars_cloud. RemoteEngine lands with a common base class for engines. That is an internal engine layout change. Public DataFrame code should not need a rewrite for it.

Streaming drops unused projections in a filter. when/then/otherwise skips work on masked out elements. DataFrame filter rechunks its mask. Those cut work in the planner and kernels. They do not change result schema.

Decimal sum now raises on overflow. Earlier tags wrapped the value. Jobs that summed wide Decimal columns and ignored wraparound will start failing. That is the correct failure mode. Catch it in aggregate tests before promoting the tag.

Parquet written by fastparquet could trip an assertion or load wrong data. Nested Arrow LargeList could corrupt a Series. Arrow maps dropped nulls on import. Utf8 and Binary Arrow buffers used a wrong offset. Those are load path bugs, not new file formats.

Eager unpivot now selects columns the same way the lazy engine does. Nulls at the start of business day functions are handled. Null values in the by column propagate through rolling_*_by. Expr.is_not_nan handles null. Boolean min, max, any, and all aggregations no longer fragment chunks.

__arrow_c_stream__ releases the GIL while resolving schema. Python threads waiting on that path get CPU time back during schema resolve.

Out of core spill of categoricals is fixed. Exceeding the Parquet metadata scan cache no longer panics. Predicate pushdown no longer strips nested caches past a cache node. IO plugins no longer receive a predicate they cannot evaluate.

A few items in the notes are internal. CSPE hashing no longer uses cryptographic hashes and now checks shallow IR node equality. Clippy and toolchain bumps, pytest dist=loadgroup, and Pyrefly 100% type coverage in CI sit in that bucket. Those do not change user facing APIs.

rechunk is deprecated on all read and scan functions. Expr.rechunk() is deprecated. struct.rename_fields() is deprecated when the field count does not match. The notes do not name a replacement for the scan rechunk parameter. struct.drop() is the new way to drop struct fields.

Docs add a migration guide aimed at the 2.0 release. This tag is still 1.44.0. The guide is documentation only.

read_database_uri docs now spell out SQLAlchemy requirements. monitoring is restored as an engine level parameter.

CI works with NumPy 2.5.2 again. That matters if a test image pinned that NumPy and the previous Polars tag failed in CI.