arrow-lint
Sharpen your Arrow datasets.
ArrowLint is a fast, opinionated, extensible linter for Apache Arrow datasets and related formats. It provides quick local feedback, CI-friendly reports, and a rule system designed for the Arrow ecosystem.
Features
- Rust core engine with a common dataset model.
- Scanners for Parquet, Arrow IPC files and streams, Feather, and Vortex files.
- Iceberg table metadata JSON scanning, including gzip-compressed metadata.
- Lance table-manifest scanning for local
*.lancedataset directories. - Vortex postscript and footer metadata validation.
- Python API and Python-first CLI.
- Native Rust CLI for direct integration.
- ArrowDiff metadata and statistics comparison for dataset revisions.
- Built-in rules for schema consistency, metadata, row groups, statistics, compression, timestamp portability, dictionary encoding, small files, and GeoParquet, Iceberg, Lance, and Vortex metadata integrity.
- JSON, SARIF, and human-readable reports.
- YAML declarative rules for simple metadata checks.
- Extension points for additional rule packs.
Supported Inputs
ArrowLint scans:
- Apache Parquet
- Apache Arrow IPC files and stored streams (
*.arrow,*.arrows, and*.ipc) - Feather files
- Apache Iceberg table metadata files (
*.metadata.jsonand gzip variants) - Lance dataset directories (
*.lance) - Vortex files (
*.vortexand*.vx)
The project also defines an extension boundary for DuckDB-focused checks. Iceberg table metadata, the latest local Lance manifest, and Vortex container metadata are checked by built-in rules.
Installation
uv sync
uv run maturin develop
CLI
uv run arrow-lint lint path/to/dataset --config .arrowlint.yaml
uv run arrow-lint lint path/to/dataset --only AL011
uv run arrow-lint lint path/to/dataset --disable AL004
uv run arrow-lint lint path/to/dataset --output json
uv run arrow-lint lint path/to/dataset --output sarif > arrowlint.sarif
uv run arrow-lint rules
uv run arrow-lint formats
uv run arrow-lint diff old.parquet new.parquet
uv run arrowdiff old.parquet new.parquet
ArrowDiff compares schemas, column statistics, metadata, row-group layout, compression, row counts, and estimated scan bytes. Parquet comparisons use footer metadata without decoding column values:
ArrowDiff
old.parquet → new.parquet
✓ Schema identical
Column changes
- phenotype_score
- temporary_column
Metadata
Changed:
~ microscope_model
Statistics
Row groups changed (1 → 2)
Compression changed (UNCOMPRESSED → ZSTD)
Estimated scan cost +18.0% (1000000 → 1180000 bytes)
Use --output json for automation and --exit-code to return status 1 when
differences are detected. ArrowDiff reports its comparison basis explicitly and
does not claim row-level equality. Arrow IPC and Feather inputs are read through
the existing batch scanner to establish row counts, but do not expose Parquet-
style column statistics.
There is also a native Rust binary:
cargo run -p arrowlint-cli -- lint path/to/dataset
cargo run -p arrowlint-cli -- diff old.parquet new.parquet
Python API
from arrow_lint import diff, lint
report = lint(
"path/to/dataset",
config=".arrowlint.yaml",
only=["AL011", "AL014"],
)
for diagnostic in report["diagnostics"]:
print(diagnostic["rule_id"], diagnostic["message"])
changes = diff("old.parquet", "new.parquet")
print(changes["statistics"]["estimated_scan_cost_change_percent"])
Configuration
ArrowLint reads YAML configuration:
scan:
recursive: true
rules:
min_row_group_rows: 100000
small_file_bytes: 67108864
iceberg_max_snapshots: 100
iceberg_max_metadata_log_entries: 100
lance_max_versions: 100
lance_target_fragment_rows: 1048576
lance_small_fragment_count: 8
lance_deletion_compaction_threshold: 0.1
fail_on: error
only: []
disabled: []
declarative_rule_files:
- examples/rules/metadata.yaml
An empty only list runs every rule. A non-empty list runs only those rule IDs.
disabled rules are removed after selection and therefore take precedence.
The repeatable CLI options --only and --disable provide invocation-specific
selection without editing the configuration file.
Declarative rules cover simple metadata checks:
rule: missing_crs
severity: warning
applies_to: parquet
check:
metadata_key: crs
Architecture
Python API / CLI
|
v
PyO3 native module Rust CLI
| |
+--------+----------+
v
arrowlint-core
/ | \
scanners dataset model rules
\ | /
lint + diff reports
The core crate owns scanning, diagnostics, rule execution, dataset comparison, and rendering. The Python package is deliberately thin so plugin authors and data teams get a comfortable interface without compromising the Rust fast path.
Extension Strategy
The built-in engine focuses on common Arrow, Feather, Parquet, Iceberg table metadata, Lance table metadata, and Vortex file metadata checks. The format pack registry defines stable boundaries for specialized rule packs:
arrowlint-duckdbfor Arrow export round-trips, nested types, timestamps, and writer settings.
Future Iceberg work can extend the built-in metadata scanner into manifest-list, manifest, delete-file, and referenced data-file validation without changing the public report model. Future Lance work can decode schema and index sections and inspect data-file internals using the same model. Future Vortex work can decode layout, dtype, statistics, and array payloads while preserving the bounded metadata scan. Other rule packs can start in this repository and move to separate packages when their public APIs are stable.
Development
cargo test
uv run maturin develop
uv run pytest
pre-commit run --all-files
Metadata
Release files for arrow-lint 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| arrow_lint-0.1.0.tar.gz | 74.8 kB | Details |
Built distributions (wheels)
Total release size: 22.7 MB
Release files / arrow_lint-0.1.0.tar.gz
| Download URL | arrow_lint-0.1.0.tar.gz |
|---|---|
| Size | 74.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7984ef2b8bc02e11dc110ebc0f301e3c29d205ff6e6e17e5e4062a15a37be721
|
|
BLAKE2b-256 checksum How to use checksums |
239c633d30177cf6256263e35ee9e60856a3ea8771f17fae9af8aa928f83ae53
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.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 Jul 30, 2026.
Transparency logRelease files / arrow_lint-0.1.0-cp313-cp313-win_amd64.whl
| Download URL | arrow_lint-0.1.0-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 1.7 MB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
16447eca3514bdf4d85245baa40442ac023b9e46498fdda461a8982402681d0d
|
|
BLAKE2b-256 checksum How to use checksums |
b719c0b03d6b53304e87fb965cb3534469e49b4f391759feab65f2c86b9c62a1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.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 Jul 30, 2026.
Transparency logRelease files / arrow_lint-0.1.0-cp313-cp313-manylinux_2_34_x86_64.whl
| Download URL | arrow_lint-0.1.0-cp313-cp313-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 2.1 MB |
| Tags | CPython 3.13 Linux glibc 2.34+ x86-64 |
|
SHA-256 checksum How to use checksums |
a7d04876cbd688402bbaf61aa569d9188b40ac5a384c41e901eefc9043d77756
|
|
BLAKE2b-256 checksum How to use checksums |
7f55578b1911a8c5680954598f0aa79ccb67835f4a97b0d9eca07b8cb5d77c38
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.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 Jul 30, 2026.
Transparency logRelease files / arrow_lint-0.1.0-cp313-cp313-manylinux_2_34_aarch64.whl
| Download URL | arrow_lint-0.1.0-cp313-cp313-manylinux_2_34_aarch64.whl |
|---|---|
| Size | 2.0 MB |
| Tags | CPython 3.13 Linux glibc 2.34+ ARM64 |
|
SHA-256 checksum How to use checksums |
50a7e1a176b760c23714317a4e630799f9033903eb1b7fd041d4b0c6c8d091ae
|
|
BLAKE2b-256 checksum How to use checksums |
36ecae8f9dbee6cdce7fecf680a71d83ba7e1c525ea5cfb931ca6b16404a3e96
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.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 Jul 30, 2026.
Transparency logRelease files / arrow_lint-0.1.0-cp313-cp313-macosx_10_12_x86_64.whl
| Download URL | arrow_lint-0.1.0-cp313-cp313-macosx_10_12_x86_64.whl |
|---|---|
| Size | 1.8 MB |
| Tags | CPython 3.13 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
189ab18e70e9844ad4486ba9ed682a684f9f738ecd2f11f516b0d88bbaef35cc
|
|
BLAKE2b-256 checksum How to use checksums |
ec1b2445bd2201316071cccba83c4ea4c83f70a556f6e9268ebfc5834bc1cf71
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.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 Jul 30, 2026.
Transparency logRelease files / arrow_lint-0.1.0-cp312-cp312-win_amd64.whl
| Download URL | arrow_lint-0.1.0-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 1.7 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
8ae15a2cb097afffb5fd93b63183665f3bade94c0c5ad1a4193cceb8576440f5
|
|
BLAKE2b-256 checksum How to use checksums |
bd4040f6c12188cf4caf930149370fc5390656661c2daa76b29236b5eaa749a6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.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 Jul 30, 2026.
Transparency logRelease files / arrow_lint-0.1.0-cp312-cp312-manylinux_2_34_x86_64.whl
| Download URL | arrow_lint-0.1.0-cp312-cp312-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 2.1 MB |
| Tags | CPython 3.12 Linux glibc 2.34+ x86-64 |
|
SHA-256 checksum How to use checksums |
e96847767cf9bdd87c7e8f532927486a5c23b77c9434a449a4728ee1496fdff7
|
|
BLAKE2b-256 checksum How to use checksums |
7b33873db7b6799b140ab94cad72041b5a9cd340063be06e5bba066aed0efbe2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.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 Jul 30, 2026.
Transparency logRelease files / arrow_lint-0.1.0-cp312-cp312-manylinux_2_34_aarch64.whl
| Download URL | arrow_lint-0.1.0-cp312-cp312-manylinux_2_34_aarch64.whl |
|---|---|
| Size | 2.0 MB |
| Tags | CPython 3.12 Linux glibc 2.34+ ARM64 |
|
SHA-256 checksum How to use checksums |
ccd0dbd5f24456a42464a7abf204cc3a9814c78eecdd52c125520a5421b56045
|
|
BLAKE2b-256 checksum How to use checksums |
5d07efcc05e8c437a428697590748a7f0ab12b84c5e17eaf0b2d12cf0257ffdd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.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 Jul 30, 2026.
Transparency logRelease files / arrow_lint-0.1.0-cp312-cp312-macosx_10_12_x86_64.whl
| Download URL | arrow_lint-0.1.0-cp312-cp312-macosx_10_12_x86_64.whl |
|---|---|
| Size | 1.8 MB |
| Tags | CPython 3.12 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
d391b04d0d1368694b11d3ab1fef96a368f3924471d392265dd6988839c36d5c
|
|
BLAKE2b-256 checksum How to use checksums |
af0c2063e83b079bd88618ebfa6cc39d3aded8bf2876785b1294d021b088c782
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.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 Jul 30, 2026.
Transparency logRelease files / arrow_lint-0.1.0-cp311-cp311-win_amd64.whl
| Download URL | arrow_lint-0.1.0-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 1.7 MB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
2c1111b733bffa731d4b7535392f7c2710f35df20f445adbc9a5878b20585986
|
|
BLAKE2b-256 checksum How to use checksums |
fe11bd9cf1e5e25f0036ab0ea4651fa0dc3326609c72db5bdfbcd9f34aef8aab
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.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 Jul 30, 2026.
Transparency logRelease files / arrow_lint-0.1.0-cp311-cp311-manylinux_2_34_x86_64.whl
| Download URL | arrow_lint-0.1.0-cp311-cp311-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 2.1 MB |
| Tags | CPython 3.11 Linux glibc 2.34+ x86-64 |
|
SHA-256 checksum How to use checksums |
b6b6aa89251150c1778a760862c1e6493bd5b575a8020fb77ce86c1895492df1
|
|
BLAKE2b-256 checksum How to use checksums |
c250e65ac458d308aa4c5557de968ace4a169817b63260ed8b8a1500d21cc5cc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.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 Jul 30, 2026.
Transparency logRelease files / arrow_lint-0.1.0-cp311-cp311-manylinux_2_34_aarch64.whl
| Download URL | arrow_lint-0.1.0-cp311-cp311-manylinux_2_34_aarch64.whl |
|---|---|
| Size | 2.0 MB |
| Tags | CPython 3.11 Linux glibc 2.34+ ARM64 |
|
SHA-256 checksum How to use checksums |
cdf0f43233dffc285f64911927743cb9e261164ac3e2e02d9734ef52dee24f84
|
|
BLAKE2b-256 checksum How to use checksums |
38fb4ca9316af2f7a50f35a72b1018a50147ed1855170daf393bac21d94662e6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.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 Jul 30, 2026.
Transparency logRelease files / arrow_lint-0.1.0-cp311-cp311-macosx_10_12_x86_64.whl
| Download URL | arrow_lint-0.1.0-cp311-cp311-macosx_10_12_x86_64.whl |
|---|---|
| Size | 1.8 MB |
| Tags | CPython 3.11 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
82dd2e52265ac62456f244423fda8ae24cc4385a90d03e8d03974a44e5d8a975
|
|
BLAKE2b-256 checksum How to use checksums |
962d65ddf9b8eb83a5a8a2b77928a65bc61cf6e59f8325aeab67a498a2688044
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.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 Jul 30, 2026.
Transparency log