Skip to main content

Parquity

Find and reproduce semantic disagreements between Parquet engines.

Continuous integration PyPI Python versions License: MIT

Parquity finds semantic disagreements and provider failures that appear when Parquet data crosses engine boundaries.

Give it either the table you meant to write or the .parquet bytes you need to investigate. Parquity runs the relevant engine matrix, compares the logical result, and saves replayable evidence when schemas, row counts, values, or provider outcomes diverge. Generated failures are reduced to small Cases; scans retain the exact input bytes.

A result records behavior, not blame. It does not choose a reference engine or prove that an upstream project has a defect.

Two ways to test

Parquity starts from either a logical table you describe or Parquet bytes you already have.

case.json  -> writer -> Parquet bytes -> reader -> compare with case.json

file.parquet -> reader A ┐
             -> reader B ├-> compare reader observations
             -> reader C ┘

A Case is not a Parquet file. It is the ordered schema and rows that should survive a writer-reader path. check evaluates one Case you provide; fuzz generates and reduces Cases. scan instead compares how readers interpret an existing .parquet file, without choosing a reference reader.

Choose a command

You have or want Command
A known schema and exact rows parquity check
Small generated interoperability cases parquity fuzz
Generated values under a fixed schema parquity fuzz --schema
One existing Parquet file or a directory of them parquity scan
A saved finding or run to reproduce parquity replay
A focused view of the symptom families already in a run parquity triage
A quick installation check parquity smoke

Install

Parquity requires Python 3.11 or newer. Parquity 0.1.0 supports Linux and macOS. Windows is not supported in this release; scan and replay of scan evidence require POSIX process-group supervision.

python -m pip install parquity

The base installation includes PyArrow, DuckDB, and Polars. DataFusion and fastparquet are optional providers; see Providers.

Check the installed core matrix:

parquity smoke

Exit 0 and PASS mean that all nine core writer-reader cells matched the built-in Case.

On a terminal, smoke prints a compact writer-reader matrix. When stdout is redirected or piped, commands emit canonical JSON instead; pass --json to request the same machine output on a terminal. smoke is ephemeral and never creates a bundle. A failing cell exits 1 with status FAIL.

Scan an existing file

parquity scan example.parquet --out scan-run

Each selected reader observes the file independently. Agreement exits 0 and creates no output directory. A disagreement, reader error, timeout, or crash exits 1 and writes scan-run/; start with scan-run/REPORT.md.

Check a known table

Save this as case.json:

{
  "format": "parquity.case.v1",
  "schema": [
    {"name": "id", "nullable": false, "type": {"kind": "int64"}},
    {"name": "active", "nullable": false, "type": {"kind": "bool"}}
  ],
  "rows": [
    [101, true],
    [102, false]
  ]
}

The first value in each row belongs to id; the second belongs to active. Run every selected writer-reader path and compare the result with those two rows:

parquity check case.json --out check-run

Matching cells exit 0 with NO_FINDING and create no output directory. Any non-passing cell exits 1 and writes a validated run with a report, canonical Case, matrix, provider versions, and reproduction material.

Documentation

  • Using Parquity: exact commands, outputs, and exit codes for each task.
  • Writing Cases: the case.json model, copyable schemas, supported types, and values.
  • Evidence and replay: reports, bundles, identities, replay states, and safe sharing.
  • Providers: install and select engines and directions.
  • Writer profiles: add compression, row-group, and statistics variants.
  • Versioning: package releases and public compatibility.

Reading a result

Successful no-finding tokens differ by command: smoke reports PASS, check and fuzz report NO_FINDING, and scan reports AGREEMENT. Each result applies only to the recorded inputs, providers, versions, directions, and options.

A finding preserves an observation and the material needed to inspect or replay it. A finding is not a defect count or a verdict about which engine is correct. See Evidence and replay before filing an upstream issue or sharing a bundle.

Aggregate REPORT.md files already include symptom families. The optional triage command exposes the same grouping with focus filters and bound replay states; use --json for its canonical machine-readable form.

Prior art

The writer-by-reader direction follows Alkis Evlogimenos's carpenter proposal in apache/parquet-format#441. Parquity does not claim to originate cross-engine Parquet testing.

Project

See CONTRIBUTING.md to work on Parquity. Report suspected vulnerabilities through SECURITY.md, not a public issue.

Parquity is available under the MIT License.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

parquity-0.1.0.tar.gz (233.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

parquity-0.1.0-py3-none-any.whl (165.8 kB view details)

Uploaded Python 3

File details

Details for the file parquity-0.1.0.tar.gz.

File metadata

  • Download URL: parquity-0.1.0.tar.gz
  • Upload date:
  • Size: 233.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for parquity-0.1.0.tar.gz
Algorithm Hash digest
SHA256 5b8251c1d5d000e7e78dda086e05c477e8de4616ef6e13256711f1406ddf5844
MD5 a2decce66d502d0e6da8d7d0b7c66a4d
BLAKE2b-256 a6ba894d10d399a335842db5504ef650980b90261de2635d2c8eec862eb9cf92

See more details on using hashes here.

Provenance

The following attestation bundles were made for parquity-0.1.0.tar.gz:

Publisher: release.yml on sovsparrow/parquity

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file parquity-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: parquity-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 165.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for parquity-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a4e318554cac1109a8ab9d17a0d5e2f6ecd8a4869249c6f4d6411ef5b71ff540
MD5 8056a72832954571438dd2d649be8d4c
BLAKE2b-256 c6f334d6c30fb2a9d7b23d3f2936aab6a1407274a70560d2c4599bfdabd651a7

See more details on using hashes here.

Provenance

The following attestation bundles were made for parquity-0.1.0-py3-none-any.whl:

Publisher: release.yml on sovsparrow/parquity

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page