Sparquet
Data engineering as JSON — with a canvas to design it and Spark to run it.
A configuration-driven PySpark framework: describe a pipeline as a JSON document, run it anywhere Spark runs. Then open the same document in Sparquet Studio, a visual, AI-assisted editor for those pipelines.
Framework · Studio · Install · Pipeline in 30 seconds · What the language covers · Docs
Two halves of one idea
The framework (sparquet/) |
Reads a JSON pipeline and executes it on Spark: readers and writers for Parquet, Delta, Iceberg, CSV, text, temp views and Kafka; 20 transformations; a validation engine with a data-quality report; template parameters, runtime pushdown variables and reusable includes. Runs locally, on Databricks, EMR, Dataproc or Synapse — the session manager detects the environment. |
The studio (sparquet-studio/) |
A browser app that reads and writes exactly those documents on a node canvas, lints them as you type, generates them with an LLM of your choice, and executes them through a local runner. No account, no server, no telemetry. |
The JSON is the contract between them. Studio never invents syntax the framework does not support, and the framework never needs Studio to run.
Install
Framework
pip install sparquet
from sparquet import Sparquet
fw = Sparquet(spark={"app_name": "MyJob", "master": "local[*]"})
result = fw.run("pipeline.json", params={"dt_ref": "2026-01-01"})
print(result.summary())
fw.stop()
Or from the CLI:
python -m sparquet.cli pipeline.json
Studio
cd sparquet-studio
npm install
npm run dev # http://localhost:5273
Full instructions, including the AI setup and the local runner, are in the Studio README.
A pipeline in 30 seconds
{
"name": "customers_curated",
"input": { "format": "csv", "path": "/data/landing/customers" },
"transformations": [
{ "type": "filter", "condition": "status = 'active'" },
{ "type": "cast", "columns": { "created_at": "timestamp" } },
{ "type": "with_column", "column": "loaded_at", "expression": "current_timestamp()" },
{ "type": "drop_duplicates", "columns": ["id"] }
],
"validations": {
"on_failure": "warn",
"rules": [
{ "type": "not_null", "columns": ["id"] },
{ "type": "unique", "columns": ["id"] }
],
"report": { "format": "csv", "path": "/dq/customers", "mode": "append" }
},
"output": {
"format": "parquet",
"path": "/data/curated/customers",
"mode": "overwrite",
"partition_by": ["created_at"]
}
}
That file runs as-is, and opens on the Studio canvas as nine connected nodes.
What the language covers
Transformations — filter select drop rename cast with_column struct drop_duplicates distinct sort fill_na sql group_by join (with broadcast map-side hint) union checkpoint stop_if_empty collect debug
IO — parquet delta iceberg csv txt view kafka read and write; relational via JDBC (postgresql mysql mariadb sqlserver oracle); warehouses (bigquery snowflake redshift); NoSQL/search (mongodb documentdb dynamodb cassandra elasticsearch). Delta and Iceberg support MERGE upserts and Delta time travel; external connectors need their driver JAR on the Spark classpath.
Validations — powered by sparquet-cola, a standalone data-quality library (pyspark-only) that installs as a dependency (pip install sparquet-cola) and is usable on its own. Rules: not_null unique range regex row_count sql (boolean invariant OR failed_rows mode), plus SODA-style check (a metric vs a warn/fail threshold) and schema (columns and types). fail / warn / skip policies, an optional per-rule metrics report, and row-level quarantine (validations.outputs: split valid/invalid to their own sinks) — all written apart from the main output.
Beyond the basics
- Template parameters
{param}substituted before parsing, with list and boolean formatting for SQL (IN ('a','b')), plusskip_if_falseto switch whole steps on and off per run. - Runtime variables
{{var}}—collecta column into a variable and push it into a later read as a literalIN (...), the declarative form of thecollect()+isin()trick that makes Delta data skipping work. - Multiple destinations with per-destination column projections and per-destination transformations, so one DataFrame can land as Parquet, as a Delta merge and as a Kafka topic in a single pass.
- Includes —
{ "$include": "shared/filters.json" }to share fragments across pipelines. - Extensible — register your own readers, writers, transformations and validators; Studio keeps unknown node types intact when it opens the file.
See CLAUDE.md for the complete schema reference.
Documentation
| Document | What it covers |
|---|---|
| CLAUDE.md | Full JSON schema, API surface and conventions |
| sparquet-studio/README.md | Studio: install, first pipeline, AI setup, local runner, architecture |
| sparquet-studio/server/README.md | The local execution service |
| docs/DEPLOY_PYPI.md | Publishing the framework to PyPI |
| ROADMAP.md | Framework roadmap |
| ROADMAP_CASE_OF_SUCCESS.md | A real migration: Spark jobs rewritten as declarative configs |
| examples/ | Runnable example pipelines |
| website/ | The public site: landing plus full documentation in English, Portuguese and Spanish |
Repository layout
sparquet/ the framework (readers, writers, transformations, validations)
sparquet-studio/ the visual editor (React + TypeScript) and its local runner
website/ landing page and documentation site (Astro + Starlight)
examples/ example pipelines, one per capability
tests/ unit tests and a full real-world migration case
docs/ deployment and reference docs
Contributing
Issues and pull requests are welcome, on either half. For Studio, keep npm run typecheck, npm run test and npm run lint clean and run npm run smoke when touching the canvas. For the framework, add an example pipeline covering any new capability.
License
Apache 2.0 — see LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sparquet-0.3.0.tar.gz.
File metadata
- Download URL: sparquet-0.3.0.tar.gz
- Upload date:
- Size: 47.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b5a63e27bd06082864df0c616c21880949a0ab23cacef7d851c2c406143a70b3
|
|
| MD5 |
5edbcc42944b722bb28572c8e2d67aa8
|
|
| BLAKE2b-256 |
189fab7b90393831bc89046ab04366b668c6ae541fc58bbe09501e44d999b9a1
|
Provenance
The following attestation bundles were made for sparquet-0.3.0.tar.gz:
Publisher:
publish.yml on VictorPasqualini/sparquet
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sparquet-0.3.0.tar.gz -
Subject digest:
b5a63e27bd06082864df0c616c21880949a0ab23cacef7d851c2c406143a70b3 - Sigstore transparency entry: 2493736524
- Sigstore integration time:
-
Permalink:
VictorPasqualini/sparquet@d8cb9851e4fddd5e39f1ecce0c35b451045b7277 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/VictorPasqualini
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d8cb9851e4fddd5e39f1ecce0c35b451045b7277 -
Trigger Event:
release
-
Statement type:
File details
Details for the file sparquet-0.3.0-py3-none-any.whl.
File metadata
- Download URL: sparquet-0.3.0-py3-none-any.whl
- Upload date:
- Size: 61.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
182f7f59cbf02207f356b19a7a2f425a404575edba3dd3d01483852b30882640
|
|
| MD5 |
00492588b9cc59562b61bac935126f2f
|
|
| BLAKE2b-256 |
069f57d4e7d41a131e2aee7d247aedc22c1407472e9f64db85424acc97be3d0d
|
Provenance
The following attestation bundles were made for sparquet-0.3.0-py3-none-any.whl:
Publisher:
publish.yml on VictorPasqualini/sparquet
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sparquet-0.3.0-py3-none-any.whl -
Subject digest:
182f7f59cbf02207f356b19a7a2f425a404575edba3dd3d01483852b30882640 - Sigstore transparency entry: 2493736991
- Sigstore integration time:
-
Permalink:
VictorPasqualini/sparquet@d8cb9851e4fddd5e39f1ecce0c35b451045b7277 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/VictorPasqualini
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d8cb9851e4fddd5e39f1ecce0c35b451045b7277 -
Trigger Event:
release
-
Statement type: