Apache Arrow Rust 60.0.0 Release


Published 29 Sep 2026
By Richard Baah & pmc

The Apache Arrow team is pleased to announce that the v60.0.0 release of Apache Arrow Rust is now available on crates.io (arrow and parquet) and as source download.

See the 60.0.0 changelog for a full list of changes.

Highlights

This release includes new Parquet encoding support, a sustained effort to remove panics from the codebase, a large number of kernel performance improvements, and many bug fixes across decimals, take/filter, and FFI.

MSRV is bumped to 1.88, rand upgraded to 0.10, object_store to 0.14.1, and several long-deprecated items have been removed. See the 60.0.0 changelog for the full breaking changes list.

New Features

Parquet ALP Encoder/Decoder Support

@sdf-jkl added support for the Adaptive Lossless Floating-Point (ALP) encoding in Parquet (#9372). ALP is a high-performance encoding for floating-point columns that enables compact storage, fast decoding and single value random-access. This makes arrow-rs the first Parquet implementations to support ALP, keeping the parquet crate aligned with the latest Parquet specification.

Parquet Page Index Improvements

@etseidl made several improvements to Parquet page index handling: a new PageIndex struct encapsulating column and offset indexes (#10719), new PageIndexBuilder and PageIndexProvider types (#10842), and page index decoders are now public (#10899). One major use case enabled by these changes is supplying external or cached PageIndexes directly to the reader (for example, indexes previously fetched and stored outside the file), avoiding redundant I/O on repeated scans. This also opens the door for selective population of the page indexes which will help reduce the latency of filtered scans against very wide tables.

Parquet NDV Statistics, FILE Logical Type, and IEEE 754 Total Order

@Rich-T-kid implemented writing num distinct values (NDV) statistics in the Parquet writer (#10654) and added row-group-level distinct counts to StatisticsConverter (#10652). Query engines use these to make better planning decisions such as join strategy selection and filter selectivity estimates.

@brkyvz added support for the FILE logical type (#10109). @etseidl implemented PARQUET-2249 IEEE 754 total order for floating-point comparisons (#9619) and the corresponding INT96 timestamp ColumnOrder (#10106). @etseidl also removed the previous limit of 32,768 row groups per file (#10149).

New arrow-cmp Crate

@Rich-T-kid introduced the arrow-cmp crate (#10325), splitting comparison kernel logic out of arrow-ord into its own focused crate. This gives users a more targeted dependency for Arrow comparison operations without pulling in the broader arrow-ord crate.

Panic Elimination

A lot of work went into converting panics into proper Result returns this release. @emilk fixed try_ functions still panicking in edge cases (#10730, #10755) and removed panics from GenericByteArray::from_iter_values (#10729). @bit2swaz replaced panics with errors in IPC schema and footer parsing (#10647, #10744) and closed an FFI Drop soundness hole (#10431). @Rich-T-kid fixed a potential use-after-free in Buffer::shrink_to_fit (#10932) and converted MutableBuffer panicking callsites to fallible methods (#10641, #10317). @okhsunrog made interleave/concat return errors on dictionary key overflow (#10675). @ranflarion converted a Parquet buffer push panic into an error (#10564) and @dhruvxvaishnav did the same for invalid dictionary index bit widths (#10725).

Performance Improvements

This release has a large number of performance improvements across kernels, casting, and Parquet I/O.

Take/Filter Kernel Improvements

@Rich-T-kid landed a series of take/filter kernel speedups this release: take on FixedSizeList is up to 3.3x faster (#10441), take on List<T> up to 1.8x faster (#10812), take on boolean and null buffers up to 1.7x faster (#10813), and filter on FixedSizeBinary up to 1.4x faster (#10993). A NullBuffer::expand rewrite for aligned counts delivers up to 143x faster buffer expansion (#10976, #10980).

@YUZHEthefool improved rank on StringViewArray by up to 3.2x faster via prefix key caching (#10605). @giladkl made equality/inequality comparisons of byte-view arrays against short scalars up to 2.5x faster (#10689). @cakeni replaced BufferBuilder with Vec across concat_elements, take_run, substring, and other kernels (#10629-#10634), and @kowanietz did the same for primitive unary operations (#10783) and fixed-size binary take (#10773), cutting unnecessary allocations across the board. @haohuaijin fixed in-place bitwise ops corrupting bits outside the requested range (#10444).

Decimal Casting

@neilconway made decimal parsing dramatically faster across the board. A foundational rewrite of the decimal-from-string path (#10668) alone delivers up to ~8x faster casting from strings to Decimal128 and up to 92% lower parsing time on individual parse microbenchmarks. A follow-up pass for separate integer/fractional digit scanning (#10974) added another 5–15% on top, and skipping redundant precision checks (#10998) added up to ~10% more. Formatting i256 without num-bigint (#11000) rounds things out with ~1.8x faster Decimal256 formatting for typical 38-digit values.

Parquet Reading Improvements

Plain Parquet string column reads into dictionary arrays are ~1.5x faster (#10614). @adriangb sped up DELTA_BYTE_ARRAY shared-prefix decoding by scanning a block at a time (#10549), reaching up to 19x faster on the prefix-scan microbenchmark and 4.2x faster end-to-end for small shared-prefix strings. @haohuaijin removed redundant copies in Parquet mask-backed intersection/union (#10446), delivering 2–6x faster mask operations depending on alignment. @hhhizzz fixed cached Mask reads crossing unloaded sparse pages (#10735).

Binary Size Reduction

@alamb reduced binary size by about 2% by monomorphizing PrimitiveArray to ArrayData conversion and Debug formatting helpers (#10893, #10890) — the Debug change alone cut ~12% of LLVM IR from the cast_kernels binary.

Bug Fixes

@neilconway fixed a cluster of decimal bugs including incorrect Decimal256 casting to signed integers (#10857), wrong min/max statistics for BYTE_ARRAY decimals (#10861), mismatched scales in make_comparator (#10864), formatting bugs (#10869), and a spurious assert when scale == precision (#10875).

@yongster fixed take for null indices in dense union and run-end encoded arrays (#10909).

@1fanwang and @tpoterba fixed take and interleave on zero-width FixedSizeListArray (#10915, #11026).

@jaideeppyne fixed struct ArrayData slicing double-counting the offset (#10835, #10934). @linhongyu510 fixed struct null validation not accounting for parent offsets (#10970).

@PlenoraETL made the IPC reader return an error for a DictionaryBatch missing its data instead of silently producing wrong results (#11020). @bit2swaz made FFI_ArrowSchema::with_metadata unsafe to close a soundness gap (#10764).

@adriangb fixed DELTA_BYTE_ARRAY deduplication for values larger than the page size limit (#10505).

Other Notable Changes

  • @adamreeve added round-trip support for Dictionary(_, Utf8View/BinaryView) columns in Parquet (#10831)
  • @ranflarion improved Parquet bloom filters: populate from the dictionary while a column is dictionary encoded (#10966) and added a writer option to skip bloom filters for all-dictionary column chunks (#10963)
  • @haohuaijin added row-group-local RowSelection support to the push decoder (#10702)
  • @1fanwang added Utf8View and BinaryView support to substring (#10672)
  • @etseidl removed previously deprecated Parquet functions (#10565) and deprecated ColumnOrder::sort_order_for_type (#10104) as a follow-up to the INT96/IEEE 754 correctness work — both are breaking changes users will notice at compile time.

Thanks to Our Contributors

$ git shortlog -sn 59.2.0..60.0.0
    38  Richard Baah
    22  Jeffrey Vo
    19  Andrew Lamb
    17  Emil Ernerfeldt
    16  Neil Conway
    12  Adrian Garcia Badaracco
    11  WaterWhisperer
    11  cakeni
    10  Ed Seidl
     8  Kosta Tarasov
     6  Huaijin
     6  ranflarion
     5  Aditya Mishra
     5  yongster
     4  Stefan Wang
     3  Abhishek
     3  Dhruv Vaishnav
     3  Thefool
     3  WissssleyL
     2  Andrea Bozzo
     2  Bharadwaj Pendyala
     2  Emily Matheys
     2  Ethan Tang
     2  Giladi
     2  Jaideep Pyne
     2  Oleks V
     2  Peter L
     2  Peter Lee
     2  Xinyao Zhang
     2  Yiming Qiao
     2  hylin
     2  pawan
     1  AarryaSaraf
     1  Adam Reeve
     1  Adam Reichold
     1  Alexander Rafferty
     1  Ali Asghar
     1  Ben Kowanietz
     1  Burak Yavuz
     1  Chao Sun
     1  Congxian Qiu
     1  Connor Tsui
     1  Danila Gornushko
     1  Fredrik Fornwall
     1  Han You
     1  Haresh Khanna
     1  Harshal Joshi
     1  Huang Qiwei
     1  Johan Vaz
     1  Jonas Dedden
     1  Jordan Epstein
     1  Langning Zhang
     1  Liam Bao
     1  Marcelo Tesla
     1  Marco Bonamente
     1  Michal Piatkowski
     1  MsfPablo
     1  Narendran K T
     1  Nuno Faria
     1  Phoenix
     1  Qi Zhu
     1  Raghvendra Singh
     1  Raz Luvaton
     1  Seowoo Jang
     1  Thor
     1  Tim Poterba
     1  Yin Li
     1  anchor
     1  kowanietz
     1  linfeng
     1  subotac
     1  wterrr
     1  yanglongwei
     1  张跃哲

Thanks to everyone who contributed bug reports, reviews, and pull requests for this release!