pub enum Partitioning {
RoundRobinBatch(usize),
Hash(Vec<Arc<dyn PhysicalExpr>>, usize),
UnknownPartitioning(usize),
}
Expand description
Output partitioning supported by ExecutionPlan
s.
When executed
, ExecutionPlan
s produce one or more independent stream of
data batches in parallel, referred to as partitions. The streams are Rust
async
Stream
s (a special kind of future). The number of output
partitions varies based on the input and the operation performed.
For example, an ExecutionPlan
that has output partitioning of 3 will
produce 3 distinct output streams as the result of calling
ExecutionPlan::execute(0)
, ExecutionPlan::execute(1)
, and
ExecutionPlan::execute(2)
, as shown below:
... ... ...
... ▲ ▲ ▲
│ │ │
▲ │ │ │
│ │ │ │
│ ┌───┴────┐ ┌───┴────┐ ┌───┴────┐
┌────────────────────┐ │ Stream │ │ Stream │ │ Stream │
│ ExecutionPlan │ │ (0) │ │ (1) │ │ (2) │
└────────────────────┘ └────────┘ └────────┘ └────────┘
▲ ▲ ▲ ▲
│ │ │ │
┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ │ │
Input │ │ │ │
└ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ │ │
▲ ┌ ─ ─ ─ ─ ┌ ─ ─ ─ ─ ┌ ─ ─ ─ ─
│ Input │ Input │ Input │
│ │ Stream │ Stream │ Stream
(0) │ (1) │ (2) │
... └ ─ ▲ ─ ─ └ ─ ▲ ─ ─ └ ─ ▲ ─ ─
│ │ │
│ │ │
│ │ │
ExecutionPlan with 1 input 3 (async) streams, one for each
that has 3 partitions, which itself output partition
has 3 output partitions
It is common (but not required) that an ExecutionPlan
has the same number
of input partitions as output partitions. However, some plans have different
numbers such as the RepartitionExec
that redistributes batches from some
number of inputs to some number of outputs
... ... ... ...
▲ ▲ ▲
▲ │ │ │
│ │ │ │
┌────────┴───────────┐ │ │ │
│ RepartitionExec │ ┌────┴───┐ ┌────┴───┐ ┌────┴───┐
└────────────────────┘ │ Stream │ │ Stream │ │ Stream │
▲ │ (0) │ │ (1) │ │ (2) │
│ └────────┘ └────────┘ └────────┘
│ ▲ ▲ ▲
... │ │ │
└──────────┐│┌──────────┘
│││
│││
RepartitionExec with 1 input
partition and 3 output partitions 3 (async) streams, that internally
pull from the same input stream
...
§Additional Examples
A simple FileScanExec
might produce one output stream (partition) for each
file (note the actual DataFusion file scaners can read individual files in
parallel, potentially producing multiple partitions per file)
Plans such as SortPreservingMerge
produce a single output stream
(1 output partition) by combining some number of input streams (input partitions)
Plans such as FilterExec
produce the same number of output streams
(partitions) as input streams (partitions).
Variants§
RoundRobinBatch(usize)
Allocate batches using a round-robin algorithm and the specified number of partitions
Hash(Vec<Arc<dyn PhysicalExpr>>, usize)
Allocate rows based on a hash of one of more expressions and the specified number of partitions
UnknownPartitioning(usize)
Unknown partitioning scheme with a known number of partitions
Implementations§
source§impl Partitioning
impl Partitioning
sourcepub fn partition_count(&self) -> usize
pub fn partition_count(&self) -> usize
Returns the number of partitions in this partitioning scheme
sourcepub fn satisfy(
&self,
required: &Distribution,
eq_properties: &EquivalenceProperties,
) -> bool
pub fn satisfy( &self, required: &Distribution, eq_properties: &EquivalenceProperties, ) -> bool
Returns true when the guarantees made by this Partitioning
are sufficient to
satisfy the partitioning scheme mandated by the required
Distribution
.
Trait Implementations§
source§impl Clone for Partitioning
impl Clone for Partitioning
source§fn clone(&self) -> Partitioning
fn clone(&self) -> Partitioning
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl Debug for Partitioning
impl Debug for Partitioning
source§impl Display for Partitioning
impl Display for Partitioning
source§impl PartialEq for Partitioning
impl PartialEq for Partitioning
Auto Trait Implementations§
impl Freeze for Partitioning
impl !RefUnwindSafe for Partitioning
impl Send for Partitioning
impl Sync for Partitioning
impl Unpin for Partitioning
impl !UnwindSafe for Partitioning
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§default unsafe fn clone_to_uninit(&self, dst: *mut T)
default unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)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