Skip to main content

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 *.lance dataset 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.json and gzip variants)
  • Lance dataset directories (*.lance)
  • Vortex files (*.vortex and *.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-duckdb for 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)

Source distribution for arrow-lint 0.1.0
File Size Uploaded
arrow_lint-0.1.0.tar.gz 74.8 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for arrow-lint 0.1.0
File
arrow_lint-0.1.0-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
arrow_lint-0.1.0-cp313-cp313-manylinux_2_34_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.34+ x86-64 Details
arrow_lint-0.1.0-cp313-cp313-manylinux_2_34_aarch64.whl CPython 3.13 CPython 3.13 Linux glibc 2.34+ ARM64 Details
arrow_lint-0.1.0-cp313-cp313-macosx_10_12_x86_64.whl CPython 3.13 CPython 3.13 macOS 10.12+ x86-64 Details
arrow_lint-0.1.0-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
arrow_lint-0.1.0-cp312-cp312-manylinux_2_34_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.34+ x86-64 Details
arrow_lint-0.1.0-cp312-cp312-manylinux_2_34_aarch64.whl CPython 3.12 CPython 3.12 Linux glibc 2.34+ ARM64 Details
arrow_lint-0.1.0-cp312-cp312-macosx_10_12_x86_64.whl CPython 3.12 CPython 3.12 macOS 10.12+ x86-64 Details
arrow_lint-0.1.0-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
arrow_lint-0.1.0-cp311-cp311-manylinux_2_34_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.34+ x86-64 Details
arrow_lint-0.1.0-cp311-cp311-manylinux_2_34_aarch64.whl CPython 3.11 CPython 3.11 Linux glibc 2.34+ ARM64 Details
arrow_lint-0.1.0-cp311-cp311-macosx_10_12_x86_64.whl CPython 3.11 CPython 3.11 macOS 10.12+ x86-64 Details

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 log

Release 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 log

Release 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 log

Release 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 log

Release 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 log

Release 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 log

Release 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 log

Release 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 log

Release 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 log

Release 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 log

Release 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 log

Release 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 log

Release 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

Release history Release notifications | RSS feed

This release

0.1.0 This release

13 release files

0.0.9

13 release files

0.0.4

1 release file

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