22 major breaking releases

51.0.0 Mar 18, 2024
50.0.0 Jan 12, 2024
49.0.0 Nov 13, 2023
48.0.1 Nov 13, 2023
29.0.0 Dec 12, 2022

#104 in Algorithms

Download history 75189/week @ 2024-01-25 89983/week @ 2024-02-01 82033/week @ 2024-02-08 89798/week @ 2024-02-15 105342/week @ 2024-02-22 113059/week @ 2024-02-29 108377/week @ 2024-03-07 120499/week @ 2024-03-14 106726/week @ 2024-03-21 109212/week @ 2024-03-28 101474/week @ 2024-04-04 110918/week @ 2024-04-11 153971/week @ 2024-04-18 151872/week @ 2024-04-25 146543/week @ 2024-05-02 130721/week @ 2024-05-09

609,855 downloads per month
Used in 257 crates (14 directly)


45K SLoC

Native Rust implementation of Apache Arrow and Parquet

Coverage Status

Welcome to the implementation of Arrow, the popular in-memory columnar format, in Rust.

This repo contains the following main components:

Crate Description Latest API Docs README
arrow Core functionality (memory layout, arrays, low level computations) docs.rs (README)
parquet Support for Parquet columnar file format docs.rs (README)
arrow-flight Support for Arrow-Flight IPC protocol docs.rs (README)
object-store Support for object store interactions (aws, azure, gcp, local, in-memory) docs.rs (README)

The current development version the API documentation in this repo can be found here.

There are two related crates in a different repository

Crate Description Documentation
DataFusion In-memory query engine with SQL support (README)
Ballista Distributed query execution (README)

Collectively, these crates support a vast array of functionality for analytic computations in Rust.

For example, you can write an SQL query or a DataFrame (using the datafusion crate), run it against a parquet file (using the parquet crate), evaluate it in-memory using Arrow's columnar format (using the arrow crate), and send to another process (using the arrow-flight crate).

Generally speaking, the arrow crate offers functionality for using Arrow arrays, and datafusion offers most operations typically found in SQL, including joins and window functions.

You can find more details about each crate in their respective READMEs.

Arrow Rust Community

The dev@arrow.apache.org mailing list serves as the core communication channel for the Arrow community. Instructions for signing up and links to the archives can be found at the Arrow Community page. All major announcements and communications happen there.

The Rust Arrow community also uses the official ASF Slack for informal discussions and coordination. This is a great place to meet other contributors and get guidance on where to contribute. Join us in the #arrow-rust channel and feel free to ask for an invite via:

  1. the dev@arrow.apache.org mailing list
  2. the GitHub Discussions
  3. the Discord channel

The Rust implementation uses GitHub issues as the system of record for new features and bug fixes and this plays a critical role in the release process.

For design discussions we generally collaborate on Google documents and file a GitHub issue linking to the document.

There is more information in the contributing guide.


Arrow ordering kernels

Sort RecordBatch

let a: ArrayRef = Arc::new(Int32Array::from(vec![1, 2, 3, 4]));
let b: ArrayRef = Arc::new(StringArray::from(vec!["b", "a", "e", "d"]));
let batch = RecordBatch::try_from_iter(vec![("a", a), ("b", b)]).unwrap();

// Sort by column 1
let indices = sort_to_indices(batch.column(1), None, None).unwrap();

// Apply indices to batch columns
let columns = batch.columns().iter().map(|c| take(&*c, &indices, None).unwrap()).collect();
let sorted = RecordBatch::try_new(batch.schema(), columns).unwrap();

let col1 = sorted.column(0).as_primitive::<Int32Type>();
assert_eq!(col1.values(), &[2, 1, 4, 3]);


~79K SLoC