pub struct UnionArray {
data_type: DataType,
type_ids: ScalarBuffer<i8>,
offsets: Option<ScalarBuffer<i32>>,
fields: Vec<Option<ArrayRef>>,
}
Expand description
An array of values of varying types
Each slot in a UnionArray can have a value chosen from a number
of types. Each of the possible types are named like the fields of
a StructArray
. A UnionArray
can
have two possible memory layouts, “dense” or “sparse”. For more
information on please see the
specification.
UnionBuilder can be used to
create UnionArray’s of primitive types. UnionArray
’s of nested
types are also supported but not via UnionBuilder
, see the tests
for examples.
§Examples
§Create a dense UnionArray [1, 3.2, 34]
use arrow_buffer::ScalarBuffer;
use arrow_schema::*;
use std::sync::Arc;
use arrow_array::{Array, Int32Array, Float64Array, UnionArray};
let int_array = Int32Array::from(vec![1, 34]);
let float_array = Float64Array::from(vec![3.2]);
let type_ids = [0, 1, 0].into_iter().collect::<ScalarBuffer<i8>>();
let offsets = [0, 0, 1].into_iter().collect::<ScalarBuffer<i32>>();
let union_fields = [
(0, Arc::new(Field::new("A", DataType::Int32, false))),
(1, Arc::new(Field::new("B", DataType::Float64, false))),
].into_iter().collect::<UnionFields>();
let children = vec![
Arc::new(int_array) as Arc<dyn Array>,
Arc::new(float_array),
];
let array = UnionArray::try_new(
union_fields,
type_ids,
Some(offsets),
children,
).unwrap();
let value = array.value(0).as_any().downcast_ref::<Int32Array>().unwrap().value(0);
assert_eq!(1, value);
let value = array.value(1).as_any().downcast_ref::<Float64Array>().unwrap().value(0);
assert!(3.2 - value < f64::EPSILON);
let value = array.value(2).as_any().downcast_ref::<Int32Array>().unwrap().value(0);
assert_eq!(34, value);
§Create a sparse UnionArray [1, 3.2, 34]
use arrow_buffer::ScalarBuffer;
use arrow_schema::*;
use std::sync::Arc;
use arrow_array::{Array, Int32Array, Float64Array, UnionArray};
let int_array = Int32Array::from(vec![Some(1), None, Some(34)]);
let float_array = Float64Array::from(vec![None, Some(3.2), None]);
let type_ids = [0_i8, 1, 0].into_iter().collect::<ScalarBuffer<i8>>();
let union_fields = [
(0, Arc::new(Field::new("A", DataType::Int32, false))),
(1, Arc::new(Field::new("B", DataType::Float64, false))),
].into_iter().collect::<UnionFields>();
let children = vec![
Arc::new(int_array) as Arc<dyn Array>,
Arc::new(float_array),
];
let array = UnionArray::try_new(
union_fields,
type_ids,
None,
children,
).unwrap();
let value = array.value(0).as_any().downcast_ref::<Int32Array>().unwrap().value(0);
assert_eq!(1, value);
let value = array.value(1).as_any().downcast_ref::<Float64Array>().unwrap().value(0);
assert!(3.2 - value < f64::EPSILON);
let value = array.value(2).as_any().downcast_ref::<Int32Array>().unwrap().value(0);
assert_eq!(34, value);
Fields§
§data_type: DataType
§type_ids: ScalarBuffer<i8>
§offsets: Option<ScalarBuffer<i32>>
§fields: Vec<Option<ArrayRef>>
Implementations§
Source§impl UnionArray
impl UnionArray
Sourcepub unsafe fn new_unchecked(
fields: UnionFields,
type_ids: ScalarBuffer<i8>,
offsets: Option<ScalarBuffer<i32>>,
children: Vec<ArrayRef>,
) -> Self
pub unsafe fn new_unchecked( fields: UnionFields, type_ids: ScalarBuffer<i8>, offsets: Option<ScalarBuffer<i32>>, children: Vec<ArrayRef>, ) -> Self
Creates a new UnionArray
.
Accepts type ids, child arrays and optionally offsets (for dense unions) to create
a new UnionArray
. This method makes no attempt to validate the data provided by the
caller and assumes that each of the components are correct and consistent with each other.
See try_new
for an alternative that validates the data provided.
§Safety
The type_ids
values should be positive and must match one of the type ids of the fields provided in fields
.
These values are used to index into the children
arrays.
The offsets
is provided in the case of a dense union, sparse unions should use None
.
If provided the offsets
values should be positive and must be less than the length of the
corresponding array.
In both cases above we use signed integer types to maintain compatibility with other Arrow implementations.
Sourcepub fn try_new(
fields: UnionFields,
type_ids: ScalarBuffer<i8>,
offsets: Option<ScalarBuffer<i32>>,
children: Vec<ArrayRef>,
) -> Result<Self, ArrowError>
pub fn try_new( fields: UnionFields, type_ids: ScalarBuffer<i8>, offsets: Option<ScalarBuffer<i32>>, children: Vec<ArrayRef>, ) -> Result<Self, ArrowError>
Attempts to create a new UnionArray
, validating the inputs provided.
The order of child arrays child array order must match the fields order
Sourcepub fn child(&self, type_id: i8) -> &ArrayRef
pub fn child(&self, type_id: i8) -> &ArrayRef
Accesses the child array for type_id
.
§Panics
Panics if the type_id
provided is not present in the array’s DataType
in the Union
.
Sourcepub fn type_id(&self, index: usize) -> i8
pub fn type_id(&self, index: usize) -> i8
Returns the type_id
for the array slot at index
.
§Panics
Panics if index
is greater than or equal to the number of child arrays
Sourcepub fn offsets(&self) -> Option<&ScalarBuffer<i32>>
pub fn offsets(&self) -> Option<&ScalarBuffer<i32>>
Returns the offsets
buffer if this is a dense array
Sourcepub fn value_offset(&self, index: usize) -> usize
pub fn value_offset(&self, index: usize) -> usize
Returns the offset into the underlying values array for the array slot at index
.
§Panics
Panics if index
is greater than or equal the length of the array.
Sourcepub fn type_names(&self) -> Vec<&str>
pub fn type_names(&self) -> Vec<&str>
Returns the names of the types in the union.
Sourcepub fn slice(&self, offset: usize, length: usize) -> Self
pub fn slice(&self, offset: usize, length: usize) -> Self
Returns a zero-copy slice of this array with the indicated offset and length.
Sourcepub fn into_parts(
self,
) -> (UnionFields, ScalarBuffer<i8>, Option<ScalarBuffer<i32>>, Vec<ArrayRef>)
pub fn into_parts( self, ) -> (UnionFields, ScalarBuffer<i8>, Option<ScalarBuffer<i32>>, Vec<ArrayRef>)
Deconstruct this array into its constituent parts
§Example
let mut builder = UnionBuilder::new_dense();
builder.append::<Int32Type>("a", 1).unwrap();
let union_array = builder.build()?;
// Deconstruct into parts
let (union_fields, type_ids, offsets, children) = union_array.into_parts();
// Reconstruct from parts
let union_array = UnionArray::try_new(
union_fields,
type_ids,
offsets,
children,
);
Sourcefn mask_sparse_skip_without_nulls(
&self,
nulls: Vec<(i8, NullBuffer)>,
) -> BooleanBuffer
fn mask_sparse_skip_without_nulls( &self, nulls: Vec<(i8, NullBuffer)>, ) -> BooleanBuffer
Computes the logical nulls for a sparse union, optimized for when there’s a lot of fields without nulls
Sourcefn mask_sparse_skip_fully_null(
&self,
nulls: Vec<(i8, NullBuffer)>,
) -> BooleanBuffer
fn mask_sparse_skip_fully_null( &self, nulls: Vec<(i8, NullBuffer)>, ) -> BooleanBuffer
Computes the logical nulls for a sparse union, optimized for when there’s a lot of fields fully null
Sourcefn mask_sparse_all_with_nulls_skip_one(
&self,
nulls: Vec<(i8, NullBuffer)>,
) -> BooleanBuffer
fn mask_sparse_all_with_nulls_skip_one( &self, nulls: Vec<(i8, NullBuffer)>, ) -> BooleanBuffer
Computes the logical nulls for a sparse union, optimized for when all fields contains nulls
Sourcefn mask_sparse_helper(
&self,
nulls: Vec<(i8, NullBuffer)>,
mask_chunk: impl FnMut(&[i8; 64], &mut [(i8, BitChunkIterator<'_>)]) -> u64,
mask_remainder: impl FnOnce(&[i8], &[(i8, BitChunks<'_>)]) -> u64,
) -> BooleanBuffer
fn mask_sparse_helper( &self, nulls: Vec<(i8, NullBuffer)>, mask_chunk: impl FnMut(&[i8; 64], &mut [(i8, BitChunkIterator<'_>)]) -> u64, mask_remainder: impl FnOnce(&[i8], &[(i8, BitChunks<'_>)]) -> u64, ) -> BooleanBuffer
Maps nulls
to BitChunk's
and then to BitChunkIterator's
, then divides self.type_ids
into exact chunks of 64 values,
calling mask_chunk
for every exact chunk, and mask_remainder
for the remainder, if any, collecting the result in a BooleanBuffer
Sourcefn gather_nulls(&self, nulls: Vec<(i8, NullBuffer)>) -> BooleanBuffer
fn gather_nulls(&self, nulls: Vec<(i8, NullBuffer)>) -> BooleanBuffer
Computes the logical nulls for a sparse or dense union, by gathering individual bits from the null buffer of the selected field
Trait Implementations§
Source§impl Array for UnionArray
impl Array for UnionArray
Source§fn data_type(&self) -> &DataType
fn data_type(&self) -> &DataType
DataType
] of this array. Read moreSource§fn slice(&self, offset: usize, length: usize) -> ArrayRef
fn slice(&self, offset: usize, length: usize) -> ArrayRef
Source§fn shrink_to_fit(&mut self)
fn shrink_to_fit(&mut self)
Source§fn offset(&self) -> usize
fn offset(&self) -> usize
0
. Read moreSource§fn nulls(&self) -> Option<&NullBuffer>
fn nulls(&self) -> Option<&NullBuffer>
Source§fn logical_nulls(&self) -> Option<NullBuffer>
fn logical_nulls(&self) -> Option<NullBuffer>
NullBuffer
] that represents the logical
null values of this array, if any. Read moreSource§fn is_nullable(&self) -> bool
fn is_nullable(&self) -> bool
false
if the array is guaranteed to not contain any logical nulls Read moreSource§fn get_buffer_memory_size(&self) -> usize
fn get_buffer_memory_size(&self) -> usize
Source§fn get_array_memory_size(&self) -> usize
fn get_array_memory_size(&self) -> usize
get_buffer_memory_size()
and
includes the overhead of the data structures that contain the pointers to the various buffers.Source§fn null_count(&self) -> usize
fn null_count(&self) -> usize
Source§fn logical_null_count(&self) -> usize
fn logical_null_count(&self) -> usize
Source§impl Clone for UnionArray
impl Clone for UnionArray
Source§fn clone(&self) -> UnionArray
fn clone(&self) -> UnionArray
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read more