pub struct GroupsAccumulatorAdapter { /* private fields */ }
Expand description
An adapter that implements GroupsAccumulator
for any Accumulator
While Accumulator
are simpler to implement and can support
more general calculations (like retractable window functions),
they are not as fast as a specialized GroupsAccumulator
. This
interface bridges the gap so the group by operator only operates
in terms of Accumulator
.
Internally, this adapter creates a new Accumulator
for each group which
stores the state for that group. This both requires an allocation for each
Accumulator, internal indices, as well as whatever internal allocations the
Accumulator itself requires.
For example, a MinAccumulator
that computes the minimum string value with
a ScalarValue::Utf8
. That will require at least two allocations per group
(one for the MinAccumulator
and one for the ScalarValue::Utf8
).
┌─────────────────────────────────┐
│MinAccumulator { │
┌─────▶│ min: ScalarValue::Utf8("A") │───────┐
│ │} │ │
│ └─────────────────────────────────┘ └───────▶ "A"
┌─────┐ │ ┌─────────────────────────────────┐
│ 0 │─────┘ │MinAccumulator { │
├─────┤ ┌─────▶│ min: ScalarValue::Utf8("Z") │───────────────▶ "Z"
│ 1 │─────┘ │} │
└─────┘ └─────────────────────────────────┘ ...
... ...
┌─────┐ ┌────────────────────────────────┐
│ N-2 │ │MinAccumulator { │
├─────┤ │ min: ScalarValue::Utf8("A") │────────────────▶ "A"
│ N-1 │─────┐ │} │
└─────┘ │ └────────────────────────────────┘
│ ┌────────────────────────────────┐ ┌───────▶ "Q"
│ │MinAccumulator { │ │
└─────▶│ min: ScalarValue::Utf8("Q") │────────┘
│} │
└────────────────────────────────┘
Logical group Current Min/Max value for that group stored
number as a ScalarValue which points to an
indivdually allocated String
§Optimizations
The adapter minimizes the number of calls to Accumulator::update_batch
by first collecting the input rows for each group into a contiguous array
using compute::take
Implementations§
Source§impl GroupsAccumulatorAdapter
impl GroupsAccumulatorAdapter
Sourcepub fn new<F>(factory: F) -> GroupsAccumulatorAdapter
pub fn new<F>(factory: F) -> GroupsAccumulatorAdapter
Create a new adapter that will create a new Accumulator
for each group, using the specified factory function
Trait Implementations§
Source§impl GroupsAccumulator for GroupsAccumulatorAdapter
impl GroupsAccumulator for GroupsAccumulatorAdapter
Source§fn update_batch(
&mut self,
values: &[Arc<dyn Array>],
group_indices: &[usize],
opt_filter: Option<&BooleanArray>,
total_num_groups: usize,
) -> Result<(), DataFusionError>
fn update_batch( &mut self, values: &[Arc<dyn Array>], group_indices: &[usize], opt_filter: Option<&BooleanArray>, total_num_groups: usize, ) -> Result<(), DataFusionError>
Source§fn evaluate(
&mut self,
emit_to: EmitTo,
) -> Result<Arc<dyn Array>, DataFusionError>
fn evaluate( &mut self, emit_to: EmitTo, ) -> Result<Arc<dyn Array>, DataFusionError>
RecordBatch
, resetting the internal state. Read moreSource§fn state(
&mut self,
emit_to: EmitTo,
) -> Result<Vec<Arc<dyn Array>>, DataFusionError>
fn state( &mut self, emit_to: EmitTo, ) -> Result<Vec<Arc<dyn Array>>, DataFusionError>
Source§fn merge_batch(
&mut self,
values: &[Arc<dyn Array>],
group_indices: &[usize],
opt_filter: Option<&BooleanArray>,
total_num_groups: usize,
) -> Result<(), DataFusionError>
fn merge_batch( &mut self, values: &[Arc<dyn Array>], group_indices: &[usize], opt_filter: Option<&BooleanArray>, total_num_groups: usize, ) -> Result<(), DataFusionError>
Self::state
)
into this accumulator’s current state. Read moreSource§fn size(&self) -> usize
fn size(&self) -> usize
Source§fn convert_to_state(
&self,
values: &[Arc<dyn Array>],
opt_filter: Option<&BooleanArray>,
) -> Result<Vec<Arc<dyn Array>>, DataFusionError>
fn convert_to_state( &self, values: &[Arc<dyn Array>], opt_filter: Option<&BooleanArray>, ) -> Result<Vec<Arc<dyn Array>>, DataFusionError>
Source§fn supports_convert_to_state(&self) -> bool
fn supports_convert_to_state(&self) -> bool
true
if Self::convert_to_state
is implemented to support
intermediate aggregate state conversion.Auto Trait Implementations§
impl Freeze for GroupsAccumulatorAdapter
impl !RefUnwindSafe for GroupsAccumulatorAdapter
impl Send for GroupsAccumulatorAdapter
impl !Sync for GroupsAccumulatorAdapter
impl Unpin for GroupsAccumulatorAdapter
impl !UnwindSafe for GroupsAccumulatorAdapter
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more