Skip to content
This repository was archived by the owner on Feb 18, 2024. It is now read-only.

Commit 8e6d836

Browse files
author
Jay Chia
committed
Add deserialization of Bytes -> Decimal
1 parent 87ab844 commit 8e6d836

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

src/io/parquet/read/deserialize/simple.rs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use parquet2::{
88

99
use crate::types::i256;
1010
use crate::{
11-
array::{Array, DictionaryKey, MutablePrimitiveArray, PrimitiveArray},
11+
array::{Array, DictionaryKey, MutablePrimitiveArray, PrimitiveArray, BinaryArray},
1212
datatypes::{DataType, IntervalUnit, TimeUnit},
1313
error::{Error, Result},
1414
types::{days_ms, NativeType},
@@ -230,6 +230,36 @@ pub fn page_iter_to_arrays<'a, I: Pages + 'a>(
230230

231231
Box::new(arrays) as _
232232
}
233+
(PhysicalType::ByteArray, Decimal(_, _)) => {
234+
let pages = binary::Iter::<i32, _>::new(
235+
pages,
236+
DataType::Binary,
237+
chunk_size,
238+
num_rows,
239+
);
240+
241+
let pages = pages.map(move |maybe_array| {
242+
let array = maybe_array?;
243+
let array_len = array.len();
244+
let array = array.as_any().downcast_ref::<BinaryArray<i32>>().unwrap();
245+
let values = (0..array_len).map(|i| {
246+
let value = array.value(i);
247+
let n = value.len();
248+
if n > 16 {
249+
return Err(Error::Overflow);
250+
}
251+
Ok(super::super::convert_i128(value, n))
252+
})
253+
.collect::<Result<Vec<_>>>();
254+
let validity = array.validity().cloned();
255+
256+
PrimitiveArray::<i128>::try_new(data_type.clone(), values?.into(), validity)
257+
});
258+
259+
let arrays = pages.map(|x| x.map(|x| x.boxed()));
260+
261+
Box::new(arrays) as _
262+
}
233263
(PhysicalType::Int32, Decimal256(_, _)) => dyn_iter(iden(primitive::IntegerIter::new(
234264
pages,
235265
data_type,

src/io/parquet/read/schema/convert.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@ fn from_byte_array(
142142
(_, Some(PrimitiveConvertedType::Bson)) => DataType::Binary,
143143
(_, Some(PrimitiveConvertedType::Enum)) => DataType::Binary,
144144
(_, Some(PrimitiveConvertedType::Utf8)) => DataType::Utf8,
145+
(Some(PrimitiveLogicalType::Decimal(precision, scale)), _) => DataType::Decimal(*precision, *scale),
146+
(_, Some(PrimitiveConvertedType::Decimal(precision, scale))) => DataType::Decimal(*precision, *scale),
145147
(_, _) => DataType::Binary,
146148
}
147149
}

0 commit comments

Comments
 (0)