polars.scan_iceberg#

polars.scan_iceberg(
source: str | pyiceberg.table.Table,
*,
snapshot_id: int | None = None,
from_snapshot_id_exclusive: int | None = None,
to_snapshot_id_inclusive: int | None = None,
storage_options: StorageOptionsDict | None = None,
catalog: pyiceberg.catalog.Catalog | polars.io.iceberg.IcebergCatalogConfig | None = None,
reader_override: Literal['native', 'pyiceberg'] | None = None,
use_metadata_statistics: bool = True,
fast_deletion_count: bool | None = None,
use_pyiceberg_filter: bool = True,
) → LazyFrame[source]#

Lazily read from an Apache Iceberg table.

engine:In MemoryStreamingDistributed
Parameters:
source

A PyIceberg table, or a ‘namespace.table_name’ identifier string, or an absolute path to the metadata.

snapshot_id

The snapshot ID to scan from.

from_snapshot_id_exclusive

The snapshot ID immediately before the first append snapshot to scan. Setting this or to_snapshot_id_inclusive enables an incremental append scan. If omitted, the scan starts from the oldest ancestor of the end snapshot.

to_snapshot_id_inclusive

The last snapshot ID to include in an incremental append scan. If omitted, the table’s current snapshot is used.

storage_options

Extra options for the storage backends supported by pyiceberg. For cloud storages, this may include configurations for authentication etc.

More info is available here.

catalog

PyIceberg catalog to load the table from if the provided target was a table name.

reader_override

Overrides the reader used to read the data.

Warning

This functionality is considered unstable. It may be changed at any point without it being considered a breaking change.

Note that this parameter should not be necessary outside of testing, as polars will by default automatically select the best reader.

Available options:

  • native: Uses polars native reader. This allows for more optimizations to improve performance.

  • pyiceberg: Uses PyIceberg, which may support more features.

use_metadata_statistics

Whether to allow using statistics from Iceberg metadata files.

Warning

This functionality is considered unstable. It may be changed at any point without it being considered a breaking change.

When a filter is present, this allows using min/max statistics present in the Iceberg metadata files can be used to allow the reader to skip scanning of metadata from data files that are guaranteed to not match the filter.

If a row-count is requested (i.e. scan_iceberg().select(pl.len())), this allows returning a count directly from Iceberg metadata. Note however that for datasets containing position delete files, fast_deletion_count must also be enabled for this to work.

fast_deletion_count

Allows returning a row count calculated directly from Iceberg metadata for datasets that contain position delete files. This will give incorrect results if position delete files contain duplicated entries.

Warning

This functionality is considered unstable. It may be changed at any point without it being considered a breaking change.

use_pyiceberg_filter

Convert and push the filter to PyIceberg where possible.

Returns:
LazyFrame

Notes

Iceberg manifest lists and manifests are cached in memory for the lifetime of the process. Entries are only shared between scans with the same explicit storage properties, and scans through REST catalogs are not cached. The cache assumes that credentials taken from the environment, such as environment variables or an instance role, stay the same for the lifetime of the process.

Examples

Creates a scan for an Iceberg table from local filesystem, or object store.

>>> table_path = "file:/path/to/iceberg-table/metadata.json"
>>> pl.scan_iceberg(table_path).collect()  

Creates a scan for an Iceberg table from S3. See a list of supported storage options for S3 here.

>>> table_path = "s3://bucket/path/to/iceberg-table/metadata.json"
>>> storage_options = {
...     "s3.region": "eu-central-1",
...     "s3.access-key-id": "THE_AWS_ACCESS_KEY_ID",
...     "s3.secret-access-key": "THE_AWS_SECRET_ACCESS_KEY",
... }
>>> pl.scan_iceberg(
...     table_path, storage_options=storage_options
... ).collect()  

Creates a scan for an Iceberg table from Azure. Supported options for Azure are available here.

Following type of table paths are supported:

  • az://<container>/<path>/metadata.json

  • adl://<container>/<path>/metadata.json

  • abfs[s]://<container>/<path>/metadata.json

>>> table_path = "az://container/path/to/iceberg-table/metadata.json"
>>> storage_options = {
...     "adlfs.account-name": "AZURE_STORAGE_ACCOUNT_NAME",
...     "adlfs.account-key": "AZURE_STORAGE_ACCOUNT_KEY",
... }
>>> pl.scan_iceberg(
...     table_path, storage_options=storage_options
... ).collect()  

Creates a scan for an Iceberg table from Google Cloud Storage. Supported options for GCS are available here.

>>> table_path = "s3://bucket/path/to/iceberg-table/metadata.json"
>>> storage_options = {
...     "gcs.project-id": "my-gcp-project",
...     "gcs.oauth.token": "ya29.dr.AfM...",
... }
>>> pl.scan_iceberg(
...     table_path, storage_options=storage_options
... ).collect()  

Creates a scan for an Iceberg table with additional options. In the below example, without_files option is used which loads the table without file tracking information.

>>> table_path = "/path/to/iceberg-table/metadata.json"
>>> storage_options = {"py-io-impl": "pyiceberg.io.fsspec.FsspecFileIO"}
>>> pl.scan_iceberg(
...     table_path, storage_options=storage_options
... ).collect()  

Creates a scan for an Iceberg table using a specific snapshot ID.

>>> table_path = "/path/to/iceberg-table/metadata.json"
>>> snapshot_id = 7051579356916758811
>>> pl.scan_iceberg(table_path, snapshot_id=snapshot_id).collect()  

Creates an incremental append scan between two snapshots.

>>> pl.scan_iceberg(
...     table_path,
...     from_snapshot_id_exclusive=7051579356916758811,
...     to_snapshot_id_inclusive=8051579356916758811,
... ).collect()