Apache Spark Connect Client for Rust (Rust core + Python wrapper)

Clone this repo:
  1. c8ae7ef [SPARK-61421][CONNECT][PYTHON][INFRA] Bring python/tests and the hand-written pyspark shim under the ruff lint gate by Liang-Chi Hsieh · 9 hours ago master
  2. dfbe046 [SPARK-61431][CONNECT][TESTS] Share the loopback service and the session and golden helpers of the Rust integration tests in a common module of each crate by Liang-Chi Hsieh · 9 hours ago
  3. a75b3db [SPARK-61430][CONNECT][TESTS] Make the request structure tests of the client send their requests by Liang-Chi Hsieh · 9 hours ago
  4. f7fed01 [SPARK-61429][CONNECT][PYTHON] Share the argument-error and option helpers of the PyO3 wrappers by Liang-Chi Hsieh · 9 hours ago
  5. ede3184 [SPARK-61425][CONNECT] Frame artifact uploads in one place and reject a chunked artifact that changed size during its upload by Liang-Chi Hsieh · 11 hours ago

Spark Connect Rust Client

A fast, native Rust client for Apache Spark Connect - and a drop-in pyspark replacement with 100% public-API parity with PySpark 4.3.0. It builds spark.connect protobuf plans, manages the gRPC channel, and decodes Arrow results in Rust, speaking the same protocol and returning the same results as the reference client.

PyPI Crates.io docs.rs Spark License

Rust coverage Python coverage

📖 Documentation

Full documentation lives at apache.github.io/spark-connect-rust

The Rust API reference (generated from the crate) is on docs.rs/apache-spark-connect.

Install

Python - a faster, drop-in replacement for the pyspark-client PyPI package (uninstall any existing pyspark / pyspark-client first):

pip install pyspark-client-rust

Your Spark Connect code then runs unchanged; use it exactly like PySpark.

Rust - the native crate:

[dependencies]
apache-spark-connect = "4.3"

Quickstart (Rust)

use spark_connect::{SparkSession, functions as f, lit};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let spark = SparkSession::builder()
        .remote("sc://localhost:15002")
        .get_or_create()?;

    let df = spark
        .range(1_000_000)?
        .select([(f::col("id") * lit(2)).alias("x")])
        .filter((f::col("x") % lit(3)).eq(lit(0)));

    println!("count = {}", df.count()?);
    df.show(20)?;
    Ok(())
}

See the documentation for the full API, running a Spark Connect server, and more.

User-Defined Functions (UDFs)

Write UDFs as plain Rust functions and call them directly — #[spark_wasm_udf] compiles them to WebAssembly and ships them to the executors:

#[spark_wasm_udf]
mod udfs {
    pub fn add_one(x: i64) -> i64 { x + 1 }
}

spark.range(5)?.select([udf::add_one(col("id"))?]).show(20)?;

See the WASM UDF guide for the full setup, SQL registration, supported types, and more.

Contributing

Issues are tracked in ASF JIRA under SPARK (GitHub Issues are disabled). See the contributing guide.

License

Apache License 2.0.