Polars
| Status | verified |
|---|---|
| Reads | yes |
| Writes | yes |
| Iceberg v3 | not tested |
| Geometry, geography | not tested |
| Last verified | 2026-09-28 (Polars 1.44 + PyIceberg 0.12) |
Connect
# pip install polars "pyiceberg[pyarrow]"; the catalog object is the PyIceberg one above
import polars as pl
table = catalog.load_table("demo.cities")
df = pl.scan_iceberg(table, reader_override="pyiceberg").filter(pl.col("country") == "DE").collect()
pl.DataFrame({"id": [8], "name": ["Hamburg"], "country": ["DE"], "pop_k": [1900]}).write_iceberg(table, mode="append")
Polars reads and writes through a PyIceberg table. reader_override="pyiceberg" matters: Polars' own reader does not use the per-table credentials the catalog vends and falls back to the cloud instance-metadata address (169.254.169.254), which fails outside a cloud VM. Passing the vended credentials yourself also works (storage_options from table.io.properties: s3.access-key-id, s3.secret-access-key, s3.session-token, endpoint https://s3.lakehousebox.com, region us-east-1, path-style), but they expire within the hour; the override asks the catalog each time. Verified 2026-09-28: a filtered scan, an append, and the read-only recipe's write refused (ACCESS_DENIED).
Using Polars with LakehouseBox and found something missing, wrong or out of date here? Write to hello@lakehousebox.com: what you ran, the version, and what happened. Product names and logos are trademarks of their owners; their use here does not imply endorsement.