pqbench
PyO3 bindings for pqbench. pip install
builds a native wheel; a separate pqbench binary is not required. Two
surfaces, one wheel:
pqbench.native— the commands: one function per library path, with the same arguments. Every name is the Rust function of the same path.pqbench— the ergonomic surface over them: the client handles every command takes (Config,Dialect,Lake,Layer,Workspace) andwalk, the whole-metastore walk composed once.
Install
pip install pqbench
The wheel carries every storage backend (delta-s3, iceberg-s3), so s3://
reads and Delta/Iceberg tables work out of the box. A storage read
authenticates with the credentials= argument (a Credentials record) or,
for bytemass, with env on its request — or with the process environment.
From a checkout:
pip install maturin
maturin develop --manifest-path python/Cargo.toml
The commands
Each command is the library function of the same path, under pqbench.native,
and takes the handles and the resource's name like the Rust signature: the name
is the AIP resource name a parent record carries, so a record feeds the next
command as it is. credentials.get takes a table's name and returns its lease,
the Credentials record a storage read takes, and a record is its model's
class: record["uri"], record.uri and record.asdict() agree.
They are the walk's own pipeline — metastore, catalog, schema, table,
credentials, partition, file, bytemass — and they stop at bytemass: the
commands downstream of a byte-mass stream (viz, diff, profile,
experiment), the standalone codec benchmarks (lz, compression) and
skill are separate tools, and are not bound.
import asyncio
import pqbench
import pqbench.native
async def main():
workspace = pqbench.Workspace(pqbench.Config("https://…", token="…"))
lake = pqbench.Lake(workspace)
# The walk, one function per resource. The I/O verbs are awaitable.
await pqbench.native.metastore.get.get(workspace)
await pqbench.native.catalog.get.get(workspace, "catalogs/dbx_samples")
await pqbench.native.catalog.list.list(workspace)
await pqbench.native.schema.list.list(workspace, "catalogs/dbx_samples")
refs = await pqbench.native.table.list.list(
workspace, "catalogs/dbx_samples/schemas/nyctaxi"
)
await pqbench.native.credentials.check.check(
workspace, "catalogs/dbx_samples/schemas/nyctaxi/tables/trips"
)
# `credentials.get.get` is name -> lease: the lease is what a storage read
# takes, from the table's name alone.
credentials = await pqbench.native.credentials.get.get(workspace, refs[0]["name"])
table = await pqbench.native.table.get.get(
workspace,
lake,
refs[0]["name"], refs[0].get("uri"), credentials,
)
# `partition.list.list` and `file.list.list` stream (async iterators); the
# single-value verbs are awaitable.
async for partition in pqbench.native.partition.list.list(
lake, table["name"], table["uri"], table.get("credentials"), 86_400_000
):
async for file in pqbench.native.file.list.list(
lake, partition["uri"], partition.get("credentials"), partition["commit_versions"]
):
# The pipeline stops here: `bytemass` measures the file's bytes.
rows = await pqbench.native.bytemass.bytemass(
lake, pqbench.native.BytemassRequest(inputs=[file["uri"]])
)
print(len(rows), file["uri"])
asyncio.run(main())
The walk
walk is the one composition rather than a binding: it spans the catalog
levels and descends every table the principal may read outside compute, with
the tables in flight together (bounded by concurrency, 32 by default), and
yields each table file.
async for file in pqbench.walk(workspace):
print(file["uri"])
catalog= descends one catalog instead of every readable one. A table that
cannot be read is skipped (logged at debug), so a mixed metastore still
walks; records stream, so the walk holds no more than a bounded queue of them.
The Unity Catalog API limits requests per endpoint and per workspace, so its
calls are paced at requests_per_second — 15, one bucket per endpoint, and 0
turns pacing off. The storage reads are not paced: object storage has no such
limit and retries its own. Anything skipped is counted in a warning when the
walk ends, so a rate limit shows up as a count rather than as silently missing
files.
bytemass is the last command: it reads what file.list.list yields — a
path or URI per file — and returns one MassRow per column chunk.
rows = await pqbench.native.bytemass.bytemass(
lake, pqbench.native.BytemassRequest(inputs=["s3://…/part-00000.parquet"])
)
samples/walk.py is a runnable walk over the whole
metastore: it calls walk, spans every catalog and schema, descends the one
catalog the principal may read outside compute, and prints each table file.
PQB_ENDPOINT=https://<workspace>.cloud.databricks.com PQB_TOKEN=<bearer> \
AWS_REGION=us-east-2 python samples/walk.py
Configuration
Config(endpoint, token=None, dialect=Dialect.UNITY) carries the endpoint, the
bearer, and the dialect (UNITY or ICEBERG); Layer(endpoint=None, token=None, dialect=None).resolve() combines configuration layers into a
Config.
credentials is a Credentials record — what credentials.get returns — or
the mapping of the same fields; a read given none falls back to the process
environment. A request's env is the library's BTreeMap<String, String>,
passed straight through. A BytemassRequest names inputs (paths or glob
masks), env (the AWS_* options a remote read uses) and indexes (load the
parquet page indexes too, one extra range per file).
Publish to PyPI
.github/workflows/publish-pypi.yml
builds manylinux, macOS, and Windows wheels with
maturin and uploads them with
PyPI trusted publishing — no token
is stored. It has its own dispatch, after the matching tag is released:
gh workflow run publish-pypi.yml, or Publish Python package from the
Actions tab. Publishing is separate because PyPI names the workflow file that
may upload, and its trusted publisher does not accept a job defined in a
workflow that another workflow calls.
Its version is the workspace's: scripts/version.sh sync writes
[workspace.package] version from Cargo.toml into python/Cargo.toml before
maturin reads it, and make check-version fails when the two disagree —
python/ is its own crate and cannot inherit it.
Before the first upload:
- On PyPI, add a pending publisher for this repository: owner
pqbench, projectpqbench, workflowpublish-pypi.yml, environmentpypi. - In the GitHub repository settings, create an environment named
pypi. - Run the Publish Python package workflow.
Metadata
Release files for pqbench 0.0.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pqbench-0.0.2.tar.gz | 190.3 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| pqbench-0.0.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.9 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| pqbench-0.0.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.9 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| pqbench-0.0.2-cp39-abi3-macosx_13_0_x86_64.whl | CPython 3.9 | abi3 | macOS 13.0+ x86-64 | Details |
| pqbench-0.0.2-cp39-abi3-macosx_11_0_arm64.whl | CPython 3.9 | abi3 | macOS 11.0+ ARM64 | Details |
Total release size: 70.0 MB
Release files / pqbench-0.0.2.tar.gz
| Download URL | pqbench-0.0.2.tar.gz |
|---|---|
| Size | 190.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e0c0e2b7bbdd5c0f235da03dde4bf6da782f8eeecf3bd9cc79891fc5e827496c
|
|
BLAKE2b-256 checksum How to use checksums |
969db660adc2027cecb922916bed2689bef5444a31aba69ec626b69571c4c6dd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / pqbench-0.0.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | pqbench-0.0.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 18.4 MB |
| Tags | CPython 3.9 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
d6f604ba7a76040ec010b3284b2ebd5a84aaf178ecda81d3eccfdd68ad9b6d5a
|
|
BLAKE2b-256 checksum How to use checksums |
8fea46f1cf1751108baaabad5f435216682d9a74ce2b70e9c3d1d03654ba76da
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / pqbench-0.0.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | pqbench-0.0.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 18.6 MB |
| Tags | CPython 3.9 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
2620efe4b0fd6be21dcd3e69b3f390421bd136cbc3277b66ff80f8234a12cb0e
|
|
BLAKE2b-256 checksum How to use checksums |
fad4891814061e544e580072af99aa92e741b8be095ea56d89ab3eb0fd8ce406
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / pqbench-0.0.2-cp39-abi3-macosx_13_0_x86_64.whl
| Download URL | pqbench-0.0.2-cp39-abi3-macosx_13_0_x86_64.whl |
|---|---|
| Size | 16.7 MB |
| Tags | CPython 3.9 abi3 macOS 13.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
a6098ba14b4bb5c30ad47d147c095d2440b09aa2188a06ca77e62157670b36ab
|
|
BLAKE2b-256 checksum How to use checksums |
4b4bd9aa6eb78b7a81ee85a7f3f276fb4fb36d8058c44818ddbdd65f09c5914b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / pqbench-0.0.2-cp39-abi3-macosx_11_0_arm64.whl
| Download URL | pqbench-0.0.2-cp39-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 16.1 MB |
| Tags | CPython 3.9 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
15ed725d262d59b1bc4b8ca826cbcc1beecbe8b007a2da0dcaa35918c0c06d8a
|
|
BLAKE2b-256 checksum How to use checksums |
46466fa6d2c2858c6d4007dff213c3a1fbf045082456188b790a6b6fa1f5936e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency log