schenksj opened a new issue, #4807:
URL: https://github.com/apache/datafusion-comet/issues/4807

   ## What
   
   Wire up runtime dynamic filter pushdown (a.k.a. runtime filtering / sideways 
information passing) for Comet's native hash joins: once the build side 
completes, apply a build-key-derived predicate to probe-side batches *before* 
the hash probe.
   
   DataFusion 54 already ships the machinery — `HashJoinExec` supports an 
attached `DynamicFilterPhysicalExpr` (placeholder `lit(true)`, updated after 
the build with `min/max` bounds plus `InList` or hash-table-lookup membership 
via `SharedBuildAccumulator`), and `with_dynamic_filter_expr` is public. Comet 
never benefits because the consumer-side wiring lives in DataFusion's physical 
optimizer (`FilterPushdown` rule), and Comet constructs its physical plan 
directly without running optimizer rules.
   
   This class of optimization is one of the largest TPC-DS levers in comparable 
engines (Velox `HashProbe::pushdownDynamicFilters`; Databricks DFP reports up 
to 8x on selective star joins).
   
   ## Proposed design (generic, scan-agnostic phase)
   
   In the planner's `OpStruct::HashJoin` arm, when eligible:
   
   1. Create `DynamicFilterPhysicalExpr::new(probe_keys, lit(true))` from the 
final (post-`swap_inputs`) join's `on()` probe-side keys — always valid against 
the probe child schema, no column remapping.
   2. Attach it to the join via `with_dynamic_filter_expr` (rebuild through 
`HashJoinExecBuilder`).
   3. Wrap the join's probe child in a new `CometDynamicFilterExec` operator 
evaluating the *same* `Arc`:
      - pass-through fast path while the filter is the scalar-`true` 
placeholder (correctness never depends on population),
      - `filter_record_batch` once populated,
      - per-stream selectivity guard (auto-disable when observed selectivity > 
~0.95 after 64k rows),
      - metrics: `dynamic_filter_rows_pruned`, engaged flag.
   
   Eligibility gate (mirrors DataFusion's own): 
`join_type.on_lr_is_preserved().1` (Inner, LeftOuter, LeftSemi, RightSemi, 
LeftAnti, LeftMark), not null-aware anti join, and a new opt-in config 
`spark.comet.exec.join.dynamicFilter.enabled` (default false initially) carried 
in the `HashJoin` proto message.
   
   Timing works in Comet's partition model: each native execution corresponds 
to one Spark partition, so the build accumulator completes after that task's 
build and the filter is populated before probe batches flow. BroadcastHashJoin 
(star joins) gets a broadcast-wide filter; ShuffledHashJoin gets a 
per-partition-tight filter.
   
   ## What this phase does NOT do
   
   - No IO-level pruning inside scans (row-group/page skipping) — follow-up 
issues cover `IcebergScanExec` and the Delta contrib scan (both kernel-read 
operators, not `ParquetSource`); the `native_datafusion` `ParquetSource` 
IO-level integration is likewise a candidate follow-up.
   - No deep insertion below projections/filters on the probe side (keys would 
need remapping); the wrapper wraps the join's immediate probe child.
   
   ## Alternatives considered
   
   - Running DataFusion's `FilterPushdown` physical optimizer rule over the 
built plan: would get `ParquetSource` IO-level for free, but the rule can 
restructure the plan (absorb `FilterExec`s), breaking Comet's 
native-operator-to-Spark-node metrics mapping.
   - Stock `FilterExec` with the dynamic filter as predicate: no pre-population 
fast path, no selectivity guard.
   
   ## Test plan
   
   Rust unit tests for the operator (pass-through, post-update filtering, 
empty-build scalar-false, guard) and planner gating (join types, swap branch); 
Scala join suite parity runs (BHJ + SHJ; inner/left/semi/anti; empty build; 
NULL keys) with the config enabled, asserting `dynamic_filter_rows_pruned > 0` 
on a selective join.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to