This is an automated email from the ASF dual-hosted git repository.

mneumann pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git


The following commit(s) were added to refs/heads/main by this push:
     new 6ecbd623c0 refactor: split `num` dependency (#8459)
6ecbd623c0 is described below

commit 6ecbd623c046c081c898d5b3b2417b453c1db8db
Author: Marco Neumann <[email protected]>
AuthorDate: Fri Sep 26 14:21:25 2025 +0200

    refactor: split `num` dependency (#8459)
    
    # Which issue does this PR close?
    \-
    
    # Rationale for this change
    `num` is a meta-crate that bundles functionality of a bunch of `num-*`
    crates, similar to how `futures` work:
    
    ```text
    num v0.4.3
    ├── num-bigint v0.4.6
    │   ├── num-integer v0.1.46
    │   │   └── num-traits v0.2.19 (*)
    │   └── num-traits v0.2.19 (*)
    ├── num-complex v0.4.6
    │   └── num-traits v0.2.19 (*)
    ├── num-integer v0.1.46 (*)
    ├── num-iter v0.1.45
    │   ├── num-integer v0.1.46 (*)
    │   └── num-traits v0.2.19 (*)
    │   [build-dependencies]
    │   └── autocfg v1.5.0
    ├── num-rational v0.4.2
    │   ├── num-bigint v0.4.6 (*)
    │   ├── num-integer v0.1.46 (*)
    │   └── num-traits v0.2.19 (*)
    └── num-traits v0.2.19 (*)
    ```
    
    We don't need all these sub-crates but only a very specific set. So
    instead of using the meta-crate, let's use the actual things we need.
    
    # What changes are included in this PR?
    Dependency changes.
    
    # Are these changes tested?
    It still compiles.
    
    # Are there any user-facing changes?
    Faster compilation.
---
 arrow-arith/Cargo.toml                             |  2 +-
 arrow-arith/src/bitwise.rs                         |  2 +-
 arrow-array/Cargo.toml                             |  4 ++-
 arrow-array/src/arithmetic.rs                      |  2 +-
 arrow-array/src/array/byte_view_array.rs           |  2 +-
 arrow-array/src/array/list_array.rs                |  4 +--
 .../fixed_size_binary_dictionary_builder.rs        |  4 +--
 arrow-array/src/builder/generic_bytes_builder.rs   |  2 +-
 .../builder/generic_bytes_dictionary_builder.rs    |  4 +--
 .../src/builder/primitive_dictionary_builder.rs    |  4 +--
 arrow-buffer/Cargo.toml                            |  3 ++-
 arrow-buffer/benches/i256.rs                       |  2 +-
 arrow-buffer/src/bigint/mod.rs                     |  8 +++---
 arrow-cast/Cargo.toml                              |  2 +-
 arrow-cast/src/cast/decimal.rs                     |  2 +-
 arrow-cast/src/cast/mod.rs                         | 29 +++++++++++-----------
 arrow-data/Cargo.toml                              |  3 ++-
 arrow-data/src/data.rs                             | 18 +++++++-------
 arrow-data/src/equal/list.rs                       |  2 +-
 arrow-data/src/equal/variable_size.rs              |  2 +-
 arrow-data/src/transform/list.rs                   |  3 ++-
 arrow-data/src/transform/mod.rs                    |  2 +-
 arrow-data/src/transform/run.rs                    |  2 +-
 arrow-data/src/transform/utils.rs                  |  3 ++-
 arrow-data/src/transform/variable_size.rs          |  4 +--
 arrow-integration-test/Cargo.toml                  |  3 ++-
 arrow-integration-test/src/lib.rs                  |  4 +--
 arrow-json/Cargo.toml                              |  2 +-
 arrow-json/src/reader/primitive_array.rs           |  2 +-
 arrow-select/Cargo.toml                            |  2 +-
 arrow-select/src/filter.rs                         |  2 +-
 arrow-select/src/take.rs                           |  2 +-
 arrow-select/src/window.rs                         |  2 +-
 arrow-string/Cargo.toml                            |  2 +-
 arrow-string/src/substring.rs                      |  2 +-
 parquet/Cargo.toml                                 |  3 ++-
 parquet/benches/arrow_reader.rs                    |  2 +-
 parquet/src/arrow/arrow_reader/mod.rs              |  2 +-
 parquet/src/arrow/arrow_writer/mod.rs              |  2 +-
 parquet/src/encodings/decoding.rs                  |  3 +--
 parquet/src/record/api.rs                          |  2 +-
 parquet/src/util/bit_util.rs                       |  4 +--
 42 files changed, 81 insertions(+), 75 deletions(-)

diff --git a/arrow-arith/Cargo.toml b/arrow-arith/Cargo.toml
index a3fdafa823..f2a4604c11 100644
--- a/arrow-arith/Cargo.toml
+++ b/arrow-arith/Cargo.toml
@@ -41,4 +41,4 @@ arrow-buffer = { workspace = true }
 arrow-data = { workspace = true }
 arrow-schema = { workspace = true }
 chrono = { workspace = true }
-num = { version = "0.4", default-features = false, features = ["std"] }
+num-traits = { version = "0.2.19", default-features = false, features = 
["std"] }
diff --git a/arrow-arith/src/bitwise.rs b/arrow-arith/src/bitwise.rs
index a3c18136c5..aedeecd5b8 100644
--- a/arrow-arith/src/bitwise.rs
+++ b/arrow-arith/src/bitwise.rs
@@ -21,7 +21,7 @@ use crate::arity::{binary, unary};
 use arrow_array::*;
 use arrow_buffer::ArrowNativeType;
 use arrow_schema::ArrowError;
-use num::traits::{WrappingShl, WrappingShr};
+use num_traits::{WrappingShl, WrappingShr};
 use std::ops::{BitAnd, BitOr, BitXor, Not};
 
 /// The helper function for bitwise operation with two array
diff --git a/arrow-array/Cargo.toml b/arrow-array/Cargo.toml
index 9fffe3b6bb..94c595f079 100644
--- a/arrow-array/Cargo.toml
+++ b/arrow-array/Cargo.toml
@@ -44,7 +44,9 @@ arrow-schema = { workspace = true }
 arrow-data = { workspace = true }
 chrono = { workspace = true }
 chrono-tz = { version = "0.10", optional = true }
-num = { version = "0.4.1", default-features = false, features = ["std"] }
+num-complex = { version = "0.4.6", default-features = false, features = 
["std"] }
+num-integer = { version = "0.1.46", default-features = false, features = 
["std"] }
+num-traits = { version = "0.2.19", default-features = false, features = 
["std"] }
 half = { version = "2.1", default-features = false, features = ["num-traits"] }
 hashbrown = { version = "0.16.0", default-features = false }
 
diff --git a/arrow-array/src/arithmetic.rs b/arrow-array/src/arithmetic.rs
index 0e2aa5a28c..24deec36fb 100644
--- a/arrow-array/src/arithmetic.rs
+++ b/arrow-array/src/arithmetic.rs
@@ -18,7 +18,7 @@
 use arrow_buffer::{i256, ArrowNativeType, IntervalDayTime, 
IntervalMonthDayNano};
 use arrow_schema::ArrowError;
 use half::f16;
-use num::complex::ComplexFloat;
+use num_complex::ComplexFloat;
 use std::cmp::Ordering;
 
 /// Trait for [`ArrowNativeType`] that adds checked and unchecked arithmetic 
operations,
diff --git a/arrow-array/src/array/byte_view_array.rs 
b/arrow-array/src/array/byte_view_array.rs
index 7c8993d602..ec65b422f7 100644
--- a/arrow-array/src/array/byte_view_array.rs
+++ b/arrow-array/src/array/byte_view_array.rs
@@ -25,7 +25,7 @@ use arrow_buffer::{ArrowNativeType, Buffer, NullBuffer, 
ScalarBuffer};
 use arrow_data::{ArrayData, ArrayDataBuilder, ByteView, MAX_INLINE_VIEW_LEN};
 use arrow_schema::{ArrowError, DataType};
 use core::str;
-use num::ToPrimitive;
+use num_traits::ToPrimitive;
 use std::any::Any;
 use std::cmp::Ordering;
 use std::fmt::Debug;
diff --git a/arrow-array/src/array/list_array.rs 
b/arrow-array/src/array/list_array.rs
index 0ddccb9681..2270987524 100644
--- a/arrow-array/src/array/list_array.rs
+++ b/arrow-array/src/array/list_array.rs
@@ -24,7 +24,7 @@ use crate::{
 use arrow_buffer::{ArrowNativeType, NullBuffer, OffsetBuffer};
 use arrow_data::{ArrayData, ArrayDataBuilder};
 use arrow_schema::{ArrowError, DataType, FieldRef};
-use num::Integer;
+use num_integer::Integer;
 use std::any::Any;
 use std::sync::Arc;
 
@@ -38,7 +38,7 @@ use std::sync::Arc;
 /// [`StringArray`]: crate::array::StringArray
 /// [`LargeStringArray`]: crate::array::LargeStringArray
 pub trait OffsetSizeTrait:
-    ArrowNativeType + std::ops::AddAssign + Integer + num::CheckedAdd
+    ArrowNativeType + std::ops::AddAssign + Integer + num_traits::CheckedAdd
 {
     /// True for 64 bit offset size and false for 32 bit offset size
     const IS_LARGE: bool;
diff --git a/arrow-array/src/builder/fixed_size_binary_dictionary_builder.rs 
b/arrow-array/src/builder/fixed_size_binary_dictionary_builder.rs
index 852ba68022..cadcf0d399 100644
--- a/arrow-array/src/builder/fixed_size_binary_dictionary_builder.rs
+++ b/arrow-array/src/builder/fixed_size_binary_dictionary_builder.rs
@@ -22,7 +22,7 @@ use arrow_buffer::ArrowNativeType;
 use arrow_schema::DataType::FixedSizeBinary;
 use arrow_schema::{ArrowError, DataType};
 use hashbrown::HashTable;
-use num::NumCast;
+use num_traits::NumCast;
 use std::any::Any;
 use std::sync::Arc;
 
@@ -142,7 +142,7 @@ where
 
         let source_keys = source.keys_builder.finish();
         let new_keys: PrimitiveArray<K> = source_keys.try_unary(|value| {
-            num::cast::cast::<K2::Native, K::Native>(value).ok_or_else(|| {
+            num_traits::cast::cast::<K2::Native, 
K::Native>(value).ok_or_else(|| {
                 ArrowError::CastError(format!(
                     "Can't cast dictionary keys from source type {:?} to type 
{:?}",
                     K2::DATA_TYPE,
diff --git a/arrow-array/src/builder/generic_bytes_builder.rs 
b/arrow-array/src/builder/generic_bytes_builder.rs
index 1480f8f328..5a68797cb0 100644
--- a/arrow-array/src/builder/generic_bytes_builder.rs
+++ b/arrow-array/src/builder/generic_bytes_builder.rs
@@ -144,7 +144,7 @@ impl<T: ByteArrayType> GenericByteBuilder<T> {
     /// (this means that underlying null values are copied as is).
     #[inline]
     pub fn append_array(&mut self, array: &GenericByteArray<T>) -> Result<(), 
ArrowError> {
-        use num::CheckedAdd;
+        use num_traits::CheckedAdd;
         if array.len() == 0 {
             return Ok(());
         }
diff --git a/arrow-array/src/builder/generic_bytes_dictionary_builder.rs 
b/arrow-array/src/builder/generic_bytes_dictionary_builder.rs
index 1c7d8bedbc..8291f270ca 100644
--- a/arrow-array/src/builder/generic_bytes_dictionary_builder.rs
+++ b/arrow-array/src/builder/generic_bytes_dictionary_builder.rs
@@ -23,7 +23,7 @@ use crate::{
 use arrow_buffer::ArrowNativeType;
 use arrow_schema::{ArrowError, DataType};
 use hashbrown::HashTable;
-use num::NumCast;
+use num_traits::NumCast;
 use std::any::Any;
 use std::sync::Arc;
 
@@ -197,7 +197,7 @@ where
 
         let source_keys = source.keys_builder.finish();
         let new_keys: PrimitiveArray<K> = source_keys.try_unary(|value| {
-            num::cast::cast::<K2::Native, K::Native>(value).ok_or_else(|| {
+            num_traits::cast::cast::<K2::Native, 
K::Native>(value).ok_or_else(|| {
                 ArrowError::CastError(format!(
                     "Can't cast dictionary keys from source type {:?} to type 
{:?}",
                     K2::DATA_TYPE,
diff --git a/arrow-array/src/builder/primitive_dictionary_builder.rs 
b/arrow-array/src/builder/primitive_dictionary_builder.rs
index acef8446ad..8827e2257a 100644
--- a/arrow-array/src/builder/primitive_dictionary_builder.rs
+++ b/arrow-array/src/builder/primitive_dictionary_builder.rs
@@ -22,7 +22,7 @@ use crate::{
 };
 use arrow_buffer::{ArrowNativeType, ToByteSlice};
 use arrow_schema::{ArrowError, DataType};
-use num::NumCast;
+use num_traits::NumCast;
 use std::any::Any;
 use std::collections::HashMap;
 use std::sync::Arc;
@@ -210,7 +210,7 @@ where
 
         let source_keys = source.keys_builder.finish();
         let new_keys: PrimitiveArray<K> = source_keys.try_unary(|value| {
-            num::cast::cast::<K2::Native, K::Native>(value).ok_or_else(|| {
+            num_traits::cast::cast::<K2::Native, 
K::Native>(value).ok_or_else(|| {
                 ArrowError::CastError(format!(
                     "Can't cast dictionary keys from source type {:?} to type 
{:?}",
                     K2::DATA_TYPE,
diff --git a/arrow-buffer/Cargo.toml b/arrow-buffer/Cargo.toml
index 21ed4212da..d1651abb79 100644
--- a/arrow-buffer/Cargo.toml
+++ b/arrow-buffer/Cargo.toml
@@ -40,7 +40,8 @@ pool = []
 
 [dependencies]
 bytes = { version = "1.4" }
-num = { version = "0.4", default-features = false, features = ["std"] }
+num-bigint = { version = "0.4.6", default-features = false, features = ["std"] 
}
+num-traits = { version = "0.2.19", default-features = false, features = 
["std"] }
 half = { version = "2.1", default-features = false }
 
 [dev-dependencies]
diff --git a/arrow-buffer/benches/i256.rs b/arrow-buffer/benches/i256.rs
index 11aaa83c8d..2bbb5c0284 100644
--- a/arrow-buffer/benches/i256.rs
+++ b/arrow-buffer/benches/i256.rs
@@ -17,7 +17,7 @@
 
 use arrow_buffer::i256;
 use criterion::*;
-use num::cast::ToPrimitive;
+use num_traits::cast::ToPrimitive;
 use rand::rngs::StdRng;
 use rand::{Rng, SeedableRng};
 use std::{hint, str::FromStr};
diff --git a/arrow-buffer/src/bigint/mod.rs b/arrow-buffer/src/bigint/mod.rs
index d7959a71ab..b078555c36 100644
--- a/arrow-buffer/src/bigint/mod.rs
+++ b/arrow-buffer/src/bigint/mod.rs
@@ -17,8 +17,8 @@
 
 use crate::arith::derive_arith;
 use crate::bigint::div::div_rem;
-use num::cast::AsPrimitive;
-use num::{BigInt, FromPrimitive, ToPrimitive};
+use num_bigint::BigInt;
+use num_traits::{cast::AsPrimitive, FromPrimitive, ToPrimitive};
 use std::cmp::Ordering;
 use std::num::ParseIntError;
 use std::ops::{BitAnd, BitOr, BitXor, Neg, Shl, Shr};
@@ -304,7 +304,7 @@ impl i256 {
         let v_bytes = v.to_signed_bytes_le();
         match v_bytes.len().cmp(&32) {
             Ordering::Less => {
-                let mut bytes = if num::Signed::is_negative(&v) {
+                let mut bytes = if num_traits::Signed::is_negative(&v) {
                     [255_u8; 32]
                 } else {
                     [0; 32]
@@ -867,7 +867,7 @@ impl ToPrimitive for i256 {
 #[cfg(all(test, not(miri)))] // llvm.x86.subborrow.64 not supported by MIRI
 mod tests {
     use super::*;
-    use num::Signed;
+    use num_traits::Signed;
     use rand::{rng, Rng};
 
     #[test]
diff --git a/arrow-cast/Cargo.toml b/arrow-cast/Cargo.toml
index 99a01103d3..12da1af79f 100644
--- a/arrow-cast/Cargo.toml
+++ b/arrow-cast/Cargo.toml
@@ -47,7 +47,7 @@ arrow-schema = { workspace = true }
 arrow-select = { workspace = true }
 chrono = { workspace = true }
 half = { version = "2.1", default-features = false }
-num = { version = "0.4", default-features = false, features = ["std"] }
+num-traits = { version = "0.2.19", default-features = false, features = 
["std"] }
 lexical-core = { version = "1.0", default-features = false, features = 
["write-integers", "write-floats", "parse-integers", "parse-floats"] }
 atoi = "2.0.0"
 comfy-table = { version = "7", optional = true, default-features = false }
diff --git a/arrow-cast/src/cast/decimal.rs b/arrow-cast/src/cast/decimal.rs
index a73b593491..94f2d53828 100644
--- a/arrow-cast/src/cast/decimal.rs
+++ b/arrow-cast/src/cast/decimal.rs
@@ -83,7 +83,7 @@ impl DecimalCast for i64 {
     fn from_f64(n: f64) -> Option<Self> {
         // Call implementation explicitly otherwise this resolves to `to_i64`
         // in arrow-buffer that behaves differently.
-        num::traits::ToPrimitive::to_i64(&n)
+        num_traits::ToPrimitive::to_i64(&n)
     }
 }
 
diff --git a/arrow-cast/src/cast/mod.rs b/arrow-cast/src/cast/mod.rs
index 2034b30cb3..46061754dc 100644
--- a/arrow-cast/src/cast/mod.rs
+++ b/arrow-cast/src/cast/mod.rs
@@ -65,8 +65,7 @@ use arrow_data::transform::MutableArrayData;
 use arrow_data::ArrayData;
 use arrow_schema::*;
 use arrow_select::take::take;
-use num::cast::AsPrimitive;
-use num::{NumCast, ToPrimitive};
+use num_traits::{cast::AsPrimitive, NumCast, ToPrimitive};
 
 /// CastOptions provides a way to override the default cast behaviors
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -2216,14 +2215,14 @@ fn cast_to_decimal<D, M>(
 where
     D: DecimalType + ArrowPrimitiveType<Native = M>,
     M: ArrowNativeTypeOp + DecimalCast,
-    u8: num::traits::AsPrimitive<M>,
-    u16: num::traits::AsPrimitive<M>,
-    u32: num::traits::AsPrimitive<M>,
-    u64: num::traits::AsPrimitive<M>,
-    i8: num::traits::AsPrimitive<M>,
-    i16: num::traits::AsPrimitive<M>,
-    i32: num::traits::AsPrimitive<M>,
-    i64: num::traits::AsPrimitive<M>,
+    u8: num_traits::AsPrimitive<M>,
+    u16: num_traits::AsPrimitive<M>,
+    u32: num_traits::AsPrimitive<M>,
+    u64: num_traits::AsPrimitive<M>,
+    i8: num_traits::AsPrimitive<M>,
+    i16: num_traits::AsPrimitive<M>,
+    i32: num_traits::AsPrimitive<M>,
+    i64: num_traits::AsPrimitive<M>,
 {
     use DataType::*;
     // cast data to decimal
@@ -2351,7 +2350,7 @@ where
     R::Native: NumCast,
 {
     from.try_unary(|value| {
-        num::cast::cast::<T::Native, R::Native>(value).ok_or_else(|| {
+        num_traits::cast::cast::<T::Native, R::Native>(value).ok_or_else(|| {
             ArrowError::CastError(format!(
                 "Can't cast value {:?} to type {}",
                 value,
@@ -2370,7 +2369,7 @@ where
     T::Native: NumCast,
     R::Native: NumCast,
 {
-    from.unary_opt::<_, R>(num::cast::cast::<T::Native, R::Native>)
+    from.unary_opt::<_, R>(num_traits::cast::cast::<T::Native, R::Native>)
 }
 
 fn cast_numeric_to_binary<FROM: ArrowPrimitiveType, O: OffsetSizeTrait>(
@@ -2446,7 +2445,7 @@ fn cast_bool_to_numeric<TO>(
 ) -> Result<ArrayRef, ArrowError>
 where
     TO: ArrowPrimitiveType,
-    TO::Native: num::cast::NumCast,
+    TO::Native: num_traits::cast::NumCast,
 {
     Ok(Arc::new(bool_to_numeric_cast::<TO>(
         from.as_any().downcast_ref::<BooleanArray>().unwrap(),
@@ -2457,14 +2456,14 @@ where
 fn bool_to_numeric_cast<T>(from: &BooleanArray, _cast_options: &CastOptions) 
-> PrimitiveArray<T>
 where
     T: ArrowPrimitiveType,
-    T::Native: num::NumCast,
+    T::Native: num_traits::NumCast,
 {
     let iter = (0..from.len()).map(|i| {
         if from.is_null(i) {
             None
         } else if from.value(i) {
             // a workaround to cast a primitive to T::Native, infallible
-            num::cast::cast(1)
+            num_traits::cast::cast(1)
         } else {
             Some(T::default_value())
         }
diff --git a/arrow-data/Cargo.toml b/arrow-data/Cargo.toml
index fbed24fea1..9c7a5206b2 100644
--- a/arrow-data/Cargo.toml
+++ b/arrow-data/Cargo.toml
@@ -48,7 +48,8 @@ all-features = true
 arrow-buffer = { workspace = true }
 arrow-schema = { workspace = true }
 
-num = { version = "0.4", default-features = false, features = ["std"] }
+num-integer = { version = "0.1.46", default-features = false, features = 
["std"] }
+num-traits = { version = "0.2.19", default-features = false, features = 
["std"] }
 half = { version = "2.1", default-features = false }
 
 [dev-dependencies]
diff --git a/arrow-data/src/data.rs b/arrow-data/src/data.rs
index fca19bc3aa..ce0dced686 100644
--- a/arrow-data/src/data.rs
+++ b/arrow-data/src/data.rs
@@ -886,7 +886,7 @@ impl ArrayData {
     /// entries.
     ///
     /// For an empty array, the `buffer` can also be empty.
-    fn typed_offsets<T: ArrowNativeType + num::Num>(&self) -> Result<&[T], 
ArrowError> {
+    fn typed_offsets<T: ArrowNativeType + num_traits::Num>(&self) -> 
Result<&[T], ArrowError> {
         // An empty list-like array can have 0 offsets
         if self.len == 0 && self.buffers[0].is_empty() {
             return Ok(&[]);
@@ -896,7 +896,7 @@ impl ArrayData {
     }
 
     /// Returns a reference to the data in `buffers[idx]` as a typed slice 
after validating
-    fn typed_buffer<T: ArrowNativeType + num::Num>(
+    fn typed_buffer<T: ArrowNativeType + num_traits::Num>(
         &self,
         idx: usize,
         len: usize,
@@ -920,7 +920,7 @@ impl ArrayData {
 
     /// Does a cheap sanity check that the `self.len` values in `buffer` are 
valid
     /// offsets (of type T) into some other buffer of `values_length` bytes 
long
-    fn validate_offsets<T: ArrowNativeType + num::Num + std::fmt::Display>(
+    fn validate_offsets<T: ArrowNativeType + num_traits::Num + 
std::fmt::Display>(
         &self,
         values_length: usize,
     ) -> Result<(), ArrowError> {
@@ -970,7 +970,7 @@ impl ArrayData {
 
     /// Does a cheap sanity check that the `self.len` values in `buffer` are 
valid
     /// offsets and sizes (of type T) into some other buffer of 
`values_length` bytes long
-    fn validate_offsets_and_sizes<T: ArrowNativeType + num::Num + 
std::fmt::Display>(
+    fn validate_offsets_and_sizes<T: ArrowNativeType + num_traits::Num + 
std::fmt::Display>(
         &self,
         values_length: usize,
     ) -> Result<(), ArrowError> {
@@ -1373,7 +1373,7 @@ impl ArrayData {
     /// function would call `validate([1,2])`, and `validate([2,4])`
     fn validate_each_offset<T, V>(&self, offset_limit: usize, validate: V) -> 
Result<(), ArrowError>
     where
-        T: ArrowNativeType + TryInto<usize> + num::Num + std::fmt::Display,
+        T: ArrowNativeType + TryInto<usize> + num_traits::Num + 
std::fmt::Display,
         V: Fn(usize, Range<usize>) -> Result<(), ArrowError>,
     {
         self.typed_offsets::<T>()?
@@ -1420,7 +1420,7 @@ impl ArrayData {
     /// into `buffers[1]` are valid utf8 sequences
     fn validate_utf8<T>(&self) -> Result<(), ArrowError>
     where
-        T: ArrowNativeType + TryInto<usize> + num::Num + std::fmt::Display,
+        T: ArrowNativeType + TryInto<usize> + num_traits::Num + 
std::fmt::Display,
     {
         let values_buffer = &self.buffers[1].as_slice();
         if let Ok(values_str) = std::str::from_utf8(values_buffer) {
@@ -1452,7 +1452,7 @@ impl ArrayData {
     /// between `0` and `offset_limit`
     fn validate_offsets_full<T>(&self, offset_limit: usize) -> Result<(), 
ArrowError>
     where
-        T: ArrowNativeType + TryInto<usize> + num::Num + std::fmt::Display,
+        T: ArrowNativeType + TryInto<usize> + num_traits::Num + 
std::fmt::Display,
     {
         self.validate_each_offset::<T, _>(offset_limit, |_string_index, 
_range| {
             // No validation applied to each value, but the iteration
@@ -1465,7 +1465,7 @@ impl ArrayData {
     /// is within the range [0, max_value], inclusive
     fn check_bounds<T>(&self, max_value: i64) -> Result<(), ArrowError>
     where
-        T: ArrowNativeType + TryInto<i64> + num::Num + std::fmt::Display,
+        T: ArrowNativeType + TryInto<i64> + num_traits::Num + 
std::fmt::Display,
     {
         let required_len = self.len + self.offset;
         let buffer = &self.buffers[0];
@@ -1500,7 +1500,7 @@ impl ArrayData {
     /// Validates that each value in run_ends array is positive and strictly 
increasing.
     fn check_run_ends<T>(&self) -> Result<(), ArrowError>
     where
-        T: ArrowNativeType + TryInto<i64> + num::Num + std::fmt::Display,
+        T: ArrowNativeType + TryInto<i64> + num_traits::Num + 
std::fmt::Display,
     {
         let values = self.typed_buffer::<T>(0, self.len)?;
         let mut prev_value: i64 = 0_i64;
diff --git a/arrow-data/src/equal/list.rs b/arrow-data/src/equal/list.rs
index cc4ba3cacf..92d8f39fe9 100644
--- a/arrow-data/src/equal/list.rs
+++ b/arrow-data/src/equal/list.rs
@@ -17,7 +17,7 @@
 
 use crate::data::{count_nulls, ArrayData};
 use arrow_buffer::ArrowNativeType;
-use num::Integer;
+use num_integer::Integer;
 
 use super::equal_range;
 
diff --git a/arrow-data/src/equal/variable_size.rs 
b/arrow-data/src/equal/variable_size.rs
index d6e8e6a954..36d9684f53 100644
--- a/arrow-data/src/equal/variable_size.rs
+++ b/arrow-data/src/equal/variable_size.rs
@@ -17,7 +17,7 @@
 
 use crate::data::{contains_nulls, ArrayData};
 use arrow_buffer::ArrowNativeType;
-use num::Integer;
+use num_integer::Integer;
 
 use super::utils::equal_len;
 
diff --git a/arrow-data/src/transform/list.rs b/arrow-data/src/transform/list.rs
index 2a3cb1c207..bcd487abff 100644
--- a/arrow-data/src/transform/list.rs
+++ b/arrow-data/src/transform/list.rs
@@ -21,7 +21,8 @@ use super::{
 };
 use crate::ArrayData;
 use arrow_buffer::ArrowNativeType;
-use num::{CheckedAdd, Integer};
+use num_integer::Integer;
+use num_traits::CheckedAdd;
 
 pub(super) fn build_extend<T: ArrowNativeType + Integer + CheckedAdd>(
     array: &ArrayData,
diff --git a/arrow-data/src/transform/mod.rs b/arrow-data/src/transform/mod.rs
index d23e458acc..b4f880d38f 100644
--- a/arrow-data/src/transform/mod.rs
+++ b/arrow-data/src/transform/mod.rs
@@ -26,7 +26,7 @@ use arrow_buffer::buffer::{BooleanBuffer, NullBuffer};
 use arrow_buffer::{bit_util, i256, ArrowNativeType, Buffer, MutableBuffer};
 use arrow_schema::{ArrowError, DataType, IntervalUnit, UnionMode};
 use half::f16;
-use num::Integer;
+use num_integer::Integer;
 use std::mem;
 
 mod boolean;
diff --git a/arrow-data/src/transform/run.rs b/arrow-data/src/transform/run.rs
index af0b9e640c..9fffac0aac 100644
--- a/arrow-data/src/transform/run.rs
+++ b/arrow-data/src/transform/run.rs
@@ -18,7 +18,7 @@
 use super::{ArrayData, Extend, _MutableArrayData};
 use arrow_buffer::{ArrowNativeType, Buffer, ToByteSlice};
 use arrow_schema::DataType;
-use num::CheckedAdd;
+use num_traits::CheckedAdd;
 
 /// Generic helper to get the last run end value from a run ends array
 fn get_last_run_end<T: ArrowNativeType>(run_ends_data: 
&super::MutableArrayData) -> T {
diff --git a/arrow-data/src/transform/utils.rs 
b/arrow-data/src/transform/utils.rs
index 5407f68e0d..96b227ea03 100644
--- a/arrow-data/src/transform/utils.rs
+++ b/arrow-data/src/transform/utils.rs
@@ -16,7 +16,8 @@
 // under the License.
 
 use arrow_buffer::{bit_util, ArrowNativeType, MutableBuffer};
-use num::{CheckedAdd, Integer};
+use num_integer::Integer;
+use num_traits::CheckedAdd;
 
 /// extends the `buffer` to be able to hold `len` bits, setting all bits of 
the new size to zero.
 #[inline]
diff --git a/arrow-data/src/transform/variable_size.rs 
b/arrow-data/src/transform/variable_size.rs
index 083ee7c74d..2e082ba833 100644
--- a/arrow-data/src/transform/variable_size.rs
+++ b/arrow-data/src/transform/variable_size.rs
@@ -17,8 +17,8 @@
 
 use crate::ArrayData;
 use arrow_buffer::{ArrowNativeType, MutableBuffer};
-use num::traits::AsPrimitive;
-use num::{CheckedAdd, Integer};
+use num_integer::Integer;
+use num_traits::{AsPrimitive, CheckedAdd};
 
 use super::{
     Extend, _MutableArrayData,
diff --git a/arrow-integration-test/Cargo.toml 
b/arrow-integration-test/Cargo.toml
index d560d4fd83..39ea3b60b1 100644
--- a/arrow-integration-test/Cargo.toml
+++ b/arrow-integration-test/Cargo.toml
@@ -39,6 +39,7 @@ all-features = true
 arrow = { workspace = true }
 arrow-buffer = { workspace = true }
 hex = { version = "0.4", default-features = false, features = ["std"] }
+num-bigint = { version = "0.4", default-features = false }
+num-traits = { version = "0.2.19", default-features = false, features = 
["std"] }
 serde = { version = "1.0", default-features = false, features = ["rc", 
"derive"] }
 serde_json = { version = "1.0", default-features = false, features = ["std"] }
-num = { version = "0.4", default-features = false, features = ["std"] }
diff --git a/arrow-integration-test/src/lib.rs 
b/arrow-integration-test/src/lib.rs
index 1f4c4bd4bd..78a49f32bb 100644
--- a/arrow-integration-test/src/lib.rs
+++ b/arrow-integration-test/src/lib.rs
@@ -29,8 +29,8 @@
 #![warn(missing_docs)]
 use arrow_buffer::{IntervalDayTime, IntervalMonthDayNano, ScalarBuffer};
 use hex::decode;
-use num::BigInt;
-use num::Signed;
+use num_bigint::BigInt;
+use num_traits::Signed;
 use serde::{Deserialize, Serialize};
 use serde_json::{Map as SJMap, Value};
 use std::collections::HashMap;
diff --git a/arrow-json/Cargo.toml b/arrow-json/Cargo.toml
index de084f9597..1324c287aa 100644
--- a/arrow-json/Cargo.toml
+++ b/arrow-json/Cargo.toml
@@ -43,7 +43,7 @@ arrow-data = { workspace = true }
 arrow-schema = { workspace = true }
 half = { version = "2.1", default-features = false }
 indexmap = { version = "2.0", default-features = false, features = ["std"] }
-num = { version = "0.4", default-features = false, features = ["std"] }
+num-traits = { version = "0.2.19", default-features = false, features = 
["std"] }
 serde = { version = "1.0", default-features = false }
 serde_json = { version = "1.0", default-features = false, features = ["std"] }
 chrono = { workspace = true }
diff --git a/arrow-json/src/reader/primitive_array.rs 
b/arrow-json/src/reader/primitive_array.rs
index 257c216cf5..bf6c0a86f3 100644
--- a/arrow-json/src/reader/primitive_array.rs
+++ b/arrow-json/src/reader/primitive_array.rs
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-use num::NumCast;
+use num_traits::NumCast;
 use std::marker::PhantomData;
 
 use arrow_array::builder::PrimitiveBuilder;
diff --git a/arrow-select/Cargo.toml b/arrow-select/Cargo.toml
index 238e1a8f58..443094e6c9 100644
--- a/arrow-select/Cargo.toml
+++ b/arrow-select/Cargo.toml
@@ -40,7 +40,7 @@ arrow-buffer = { workspace = true }
 arrow-data = { workspace = true }
 arrow-schema = { workspace = true }
 arrow-array = { workspace = true }
-num = { version = "0.4", default-features = false, features = ["std"] }
+num-traits = { version = "0.2.19", default-features = false, features = 
["std"] }
 ahash = { version = "0.8", default-features = false}
 
 [dev-dependencies]
diff --git a/arrow-select/src/filter.rs b/arrow-select/src/filter.rs
index 73877bb88c..708033e6d8 100644
--- a/arrow-select/src/filter.rs
+++ b/arrow-select/src/filter.rs
@@ -794,7 +794,7 @@ fn filter_fixed_size_binary(
 fn filter_dict<T>(array: &DictionaryArray<T>, predicate: &FilterPredicate) -> 
DictionaryArray<T>
 where
     T: ArrowDictionaryKeyType,
-    T::Native: num::Num,
+    T::Native: num_traits::Num,
 {
     let builder = filter_primitive::<T>(array.keys(), predicate)
         .into_data()
diff --git a/arrow-select/src/take.rs b/arrow-select/src/take.rs
index 5bb966c678..25136ad43f 100644
--- a/arrow-select/src/take.rs
+++ b/arrow-select/src/take.rs
@@ -30,7 +30,7 @@ use arrow_buffer::{
 use arrow_data::ArrayDataBuilder;
 use arrow_schema::{ArrowError, DataType, FieldRef, UnionMode};
 
-use num::{One, Zero};
+use num_traits::{One, Zero};
 
 /// Take elements by index from [Array], creating a new [Array] from those 
indexes.
 ///
diff --git a/arrow-select/src/window.rs b/arrow-select/src/window.rs
index 2ad51561c6..3987994173 100644
--- a/arrow-select/src/window.rs
+++ b/arrow-select/src/window.rs
@@ -20,7 +20,7 @@
 use crate::concat::concat;
 use arrow_array::{make_array, new_null_array, Array, ArrayRef};
 use arrow_schema::ArrowError;
-use num::abs;
+use num_traits::abs;
 
 /// Shifts array by defined number of items (to left or right)
 /// A positive value for `offset` shifts the array to the right
diff --git a/arrow-string/Cargo.toml b/arrow-string/Cargo.toml
index 95aa289178..3045c355e4 100644
--- a/arrow-string/Cargo.toml
+++ b/arrow-string/Cargo.toml
@@ -43,5 +43,5 @@ arrow-array = { workspace = true }
 arrow-select = { workspace = true }
 regex = { version = "1.7.0", default-features = false, features = ["std", 
"unicode", "perf"] }
 regex-syntax = { version = "0.8.0", default-features = false, features = 
["unicode"] }
-num = { version = "0.4", default-features = false, features = ["std"] }
+num-traits = { version = "0.2.19", default-features = false, features = 
["std"] }
 memchr = "2.7.4"
diff --git a/arrow-string/src/substring.rs b/arrow-string/src/substring.rs
index fa6a471475..3447b62908 100644
--- a/arrow-string/src/substring.rs
+++ b/arrow-string/src/substring.rs
@@ -25,7 +25,7 @@ use arrow_array::*;
 use arrow_buffer::{ArrowNativeType, Buffer, MutableBuffer};
 use arrow_data::ArrayData;
 use arrow_schema::{ArrowError, DataType};
-use num::Zero;
+use num_traits::Zero;
 use std::cmp::Ordering;
 use std::sync::Arc;
 
diff --git a/parquet/Cargo.toml b/parquet/Cargo.toml
index 5dbd4b5b39..f57a7627a5 100644
--- a/parquet/Cargo.toml
+++ b/parquet/Cargo.toml
@@ -60,8 +60,9 @@ flate2 = { version = "1.1", default-features = false, 
optional = true }
 lz4_flex = { version = "0.11", default-features = false, features = ["std", 
"frame"], optional = true }
 zstd = { version = "0.13", optional = true, default-features = false }
 chrono = { workspace = true }
-num = { version = "0.4", default-features = false }
 num-bigint = { version = "0.4", default-features = false }
+num-integer = { version = "0.1.46", default-features = false, features = 
["std"] }
+num-traits = { version = "0.2.19", default-features = false, features = 
["std"] }
 base64 = { version = "0.22", default-features = false, features = ["std", ], 
optional = true }
 clap = { version = "4.1", default-features = false, features = ["std", 
"derive", "env", "help", "error-context", "usage"], optional = true }
 serde = { version = "1.0", default-features = false, features = ["derive"], 
optional = true }
diff --git a/parquet/benches/arrow_reader.rs b/parquet/benches/arrow_reader.rs
index 321424b820..6104d6d2a5 100644
--- a/parquet/benches/arrow_reader.rs
+++ b/parquet/benches/arrow_reader.rs
@@ -21,8 +21,8 @@ use arrow_schema::Field;
 use criterion::measurement::WallTime;
 use criterion::{criterion_group, criterion_main, BenchmarkGroup, Criterion};
 use half::f16;
-use num::FromPrimitive;
 use num_bigint::BigInt;
+use num_traits::FromPrimitive;
 use parquet::arrow::array_reader::{
     make_byte_array_reader, make_byte_view_array_reader, 
make_fixed_len_byte_array_reader,
     ListArrayReader,
diff --git a/parquet/src/arrow/arrow_reader/mod.rs 
b/parquet/src/arrow/arrow_reader/mod.rs
index 8a7e2ef709..17bc5a298e 100644
--- a/parquet/src/arrow/arrow_reader/mod.rs
+++ b/parquet/src/arrow/arrow_reader/mod.rs
@@ -1168,7 +1168,7 @@ mod tests {
     use arrow_select::concat::concat_batches;
     use bytes::Bytes;
     use half::f16;
-    use num::PrimInt;
+    use num_traits::PrimInt;
     use rand::{rng, Rng, RngCore};
     use tempfile::tempfile;
 
diff --git a/parquet/src/arrow/arrow_writer/mod.rs 
b/parquet/src/arrow/arrow_writer/mod.rs
index 25fd2396c1..8d641dc189 100644
--- a/parquet/src/arrow/arrow_writer/mod.rs
+++ b/parquet/src/arrow/arrow_writer/mod.rs
@@ -1524,7 +1524,7 @@ mod tests {
     use arrow_buffer::{i256, IntervalDayTime, IntervalMonthDayNano, 
NullBuffer};
     use arrow_schema::Fields;
     use half::f16;
-    use num::{FromPrimitive, ToPrimitive};
+    use num_traits::{FromPrimitive, ToPrimitive};
     use tempfile::tempfile;
 
     use crate::basic::Encoding;
diff --git a/parquet/src/encodings/decoding.rs 
b/parquet/src/encodings/decoding.rs
index 03bed70cd6..7b22710367 100644
--- a/parquet/src/encodings/decoding.rs
+++ b/parquet/src/encodings/decoding.rs
@@ -18,8 +18,7 @@
 //! Contains all supported decoders for Parquet.
 
 use bytes::Bytes;
-use num::traits::WrappingAdd;
-use num::FromPrimitive;
+use num_traits::{FromPrimitive, WrappingAdd};
 use std::{cmp, marker::PhantomData, mem};
 
 use super::rle::RleDecoder;
diff --git a/parquet/src/record/api.rs b/parquet/src/record/api.rs
index ebf933f33e..c55fb02269 100644
--- a/parquet/src/record/api.rs
+++ b/parquet/src/record/api.rs
@@ -21,8 +21,8 @@ use std::fmt;
 
 use chrono::{TimeZone, Utc};
 use half::f16;
-use num::traits::Float;
 use num_bigint::{BigInt, Sign};
+use num_traits::Float;
 
 use crate::basic::{ConvertedType, LogicalType, Type as PhysicalType};
 use crate::data_type::{ByteArray, Decimal, Int96};
diff --git a/parquet/src/util/bit_util.rs b/parquet/src/util/bit_util.rs
index f31f70b426..35a59e3d13 100644
--- a/parquet/src/util/bit_util.rs
+++ b/parquet/src/util/bit_util.rs
@@ -150,8 +150,8 @@ where
 /// This function should be removed after
 /// [`int_roundings`](https://github.com/rust-lang/rust/issues/88581) is 
stable.
 #[inline]
-pub fn ceil<T: num::Integer>(value: T, divisor: T) -> T {
-    num::Integer::div_ceil(&value, &divisor)
+pub fn ceil<T: num_integer::Integer>(value: T, divisor: T) -> T {
+    num_integer::Integer::div_ceil(&value, &divisor)
 }
 
 /// Returns the `num_bits` least-significant bits of `v`


Reply via email to