Skip to main content

icefloor

A terminal UI for reading Iceberg table metadata and Parquet file metadata — both in one place, with the link between them walkable: pick a data file out of an Iceberg snapshot and drop straight into that file's row groups, encodings and column statistics.

Install

Needs Python 3.12+. With uv:

uv tool install icefloor          # puts `icefloor` on your PATH
uvx icefloor path/to/table        # or run once without installing

pipx install icefloor works too. To install the latest unreleased code:

uv tool install git+https://github.com/gkoenig/icefloor

Local files need nothing more. To load tables through a PyIceberg catalog (-c), add the extra for your backend:

Extra For
sql SQL catalog backed by SQLite
s3 tables on S3 (s3fs)
glue AWS Glue catalog
uv tool install 'icefloor[s3,glue]'

Catalogs are configured the usual PyIceberg way, in ~/.pyiceberg.yaml or PYICEBERG_* environment variables.

How to use it

icefloor path/to/table
icefloor path/to/file.parquet
icefloor path/to/parts/
icefloor db.events -c prod        # table from a configured PyIceberg catalog

icefloor auto-detects what you passed in:

  • a *.parquet file
  • a directory containing Parquet files
  • an Iceberg table directory that contains a metadata/ folder
  • a *.metadata.json file
  • a catalog table name when used with -c/--catalog

Useful options:

icefloor --list-sections path/to/table
icefloor -s snapshots path/to/table
icefloor path/to/table -c prod

--list-sections prints the available section names and exits. -s jumps directly to a particular section. Once the UI opens, use the keyboard controls shown below to browse, filter and drill down into the data.

What it shows

Iceberg — table identity and format version, the current and historical schemas, partition specs and sort orders, every snapshot with its summary, refs, the manifest list, data and delete files, partition-level record/file/size statistics, the metadata log, and table properties.

Parquet — file version and writer, the Parquet and Arrow schemas with definition and repetition levels, per-row-group sizes and sort order, every column chunk with its codec and encodings, min/max/null/distinct statistics, footer key-value metadata, and a per-column footprint showing where the bytes actually went.

Numbers that benefit from it get an inline bar, scaled to the largest value on screen, so filtering re-scales the comparison. Series over snapshots or row groups also get a sparkline.

Keys

Key Action
↑ ↓ move within the focused pane
tab next pane
enter open the highlighted Parquet file
/ filter the visible rows
esc clear the filter, or go back a level
s / S scope the file views to the highlighted snapshot / back to current
r re-read the current section from storage
y copy the highlighted row's key
? help
t light / dark
q quit

Sections load on a background thread, so a table with thousands of manifests stays responsive and a section that fails to read reports the error in place.

Sample data

From a clone of the repo:

uv run python tests/fixture.py fixtures
uv run icefloor fixtures/warehouse/sales/events

Builds a partitioned Iceberg table (five snapshots, a schema evolution, an overwrite) plus loose Parquet files to poke at.

Development

git clone https://github.com/gkoenig/icefloor && cd icefloor
uv sync
uv run icefloor path/to/table
uv run pytest -q

See CLAUDE.md for the architecture.

Releasing

Bump version in pyproject.toml, commit, then tag and push:

git tag v0.1.0 && git push origin v0.1.0

The release workflow builds, tests and publishes the tag to PyPI. It uses trusted publishing, so no token is stored in the repo.

License

MIT

Metadata

Release files for icefloor 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for icefloor 0.1.0
File Size Uploaded
icefloor-0.1.0.tar.gz 19.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for icefloor 0.1.0
File Interpreter ABI Platform
icefloor-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 41.9 kB

Release files / icefloor-0.1.0.tar.gz

Download URL icefloor-0.1.0.tar.gz
Size 19.7 kB
Tags Source
SHA-256 checksum
How to use checksums
7c428218eacb87bbd9a25b1467d4d995d0c91b933469199ce64144c086764e88
BLAKE2b-256 checksum
How to use checksums
9423871b033323655e94ed7ad0e32c77d1d341cd98fc5f2caa628f5dac1bf06e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.22 {"installer":{"name":"uv","version":"0.12.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / icefloor-0.1.0-py3-none-any.whl

Download URL icefloor-0.1.0-py3-none-any.whl
Size 22.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f2fd94b2391ae54095484a3e433cab80e3f1e46b383546b44bec8f9b0e8a7377
BLAKE2b-256 checksum
How to use checksums
f50a13dabe2687a8b0b105d8f884d5dac70e85ee8e69548a397b434fb3651789
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.22 {"installer":{"name":"uv","version":"0.12.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

0.2.0

2 release files

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page