pub struct EnforceDistribution {}
Expand description
The EnforceDistribution
rule ensures that distribution requirements are
met. In doing so, this rule will increase the parallelism in the plan by
introducing repartitioning operators to the physical plan.
For example, given an input such as:
┌─────────────────────────────────┐
│ │
│ ExecutionPlan │
│ │
└─────────────────────────────────┘
▲ ▲
│ │
┌─────┘ └─────┐
│ │
│ │
│ │
┌───────────┐ ┌───────────┐
│ │ │ │
│ batch A1 │ │ batch B1 │
│ │ │ │
├───────────┤ ├───────────┤
│ │ │ │
│ batch A2 │ │ batch B2 │
│ │ │ │
├───────────┤ ├───────────┤
│ │ │ │
│ batch A3 │ │ batch B3 │
│ │ │ │
└───────────┘ └───────────┘
Input Input
A B
This rule will attempt to add a RepartitionExec
to increase parallelism
(to 3, in this case) and create the following arrangement:
┌─────────────────────────────────┐
│ │
│ ExecutionPlan │
│ │
└─────────────────────────────────┘
▲ ▲ ▲ Input now has 3
│ │ │ partitions
┌───────┘ │ └───────┐
│ │ │
│ │ │
┌───────────┐ ┌───────────┐ ┌───────────┐
│ │ │ │ │ │
│ batch A1 │ │ batch A3 │ │ batch B3 │
│ │ │ │ │ │
├───────────┤ ├───────────┤ ├───────────┤
│ │ │ │ │ │
│ batch B2 │ │ batch B1 │ │ batch A2 │
│ │ │ │ │ │
└───────────┘ └───────────┘ └───────────┘
▲ ▲ ▲
│ │ │
└─────────┐ │ ┌──────────┘
│ │ │
│ │ │
┌─────────────────────────────────┐ batches are
│ RepartitionExec(3) │ repartitioned
│ RoundRobin │
│ │
└─────────────────────────────────┘
▲ ▲
│ │
┌─────┘ └─────┐
│ │
│ │
│ │
┌───────────┐ ┌───────────┐
│ │ │ │
│ batch A1 │ │ batch B1 │
│ │ │ │
├───────────┤ ├───────────┤
│ │ │ │
│ batch A2 │ │ batch B2 │
│ │ │ │
├───────────┤ ├───────────┤
│ │ │ │
│ batch A3 │ │ batch B3 │
│ │ │ │
└───────────┘ └───────────┘
Input Input
A B
The EnforceDistribution
rule
- is idempotent; i.e. it can be applied multiple times, each time producing the same result.
- always produces a valid plan in terms of distribution requirements. Its input plan can be valid or invalid with respect to distribution requirements, but the output plan will always be valid.
- produces a valid plan in terms of ordering requirements, if its input is
a valid plan in terms of ordering requirements. If the input plan is invalid,
this rule does not attempt to fix it as doing so is the responsibility of the
EnforceSorting
rule.
Note that distribution requirements are met in the strictest way. This may
result in more than strictly necessary RepartitionExec
s in the plan, but
meeting the requirements in the strictest way may help avoid possible data
skew in joins.
For example for a hash join with keys (a, b, c), the required Distribution(a, b, c) can be satisfied by several alternative partitioning ways: (a, b, c), (a, b), (a, c), (b, c), (a), (b), (c) and ( ).
This rule only chooses the exact match and satisfies the Distribution(a, b, c) by a HashPartition(a, b, c).
Implementations§
Trait Implementations§
Source§impl Debug for EnforceDistribution
impl Debug for EnforceDistribution
Source§impl Default for EnforceDistribution
impl Default for EnforceDistribution
Source§fn default() -> EnforceDistribution
fn default() -> EnforceDistribution
Source§impl PhysicalOptimizerRule for EnforceDistribution
impl PhysicalOptimizerRule for EnforceDistribution
Source§fn optimize(
&self,
plan: Arc<dyn ExecutionPlan>,
config: &ConfigOptions,
) -> Result<Arc<dyn ExecutionPlan>>
fn optimize( &self, plan: Arc<dyn ExecutionPlan>, config: &ConfigOptions, ) -> Result<Arc<dyn ExecutionPlan>>
plan
to an optimized formSource§fn schema_check(&self) -> bool
fn schema_check(&self) -> bool
Auto Trait Implementations§
impl Freeze for EnforceDistribution
impl RefUnwindSafe for EnforceDistribution
impl Send for EnforceDistribution
impl Sync for EnforceDistribution
impl Unpin for EnforceDistribution
impl UnwindSafe for EnforceDistribution
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