You are viewing a plain text version of this content. The canonical link for it is here.
Posted to github@datafusion.apache.org by "avantgardnerio (via GitHub)" <gi...@apache.org> on 2026/08/27 20:15:03 UTC

[PR] feat(scheduler): parallel bounded ROWS-frame windows via a rank-derived halo [datafusion-ballista]

avantgardnerio opened a new pull request, #2392:
URL: https://github.com/apache/datafusion-ballista/pull/2392

   ## What this is for
   
   `BoundedWindowAggExec` requires a single input partition, so a window with no
   PARTITION BY runs serially no matter how wide the cluster is. `ParallelWindowRule`
   already fixes that for bounded RANGE frames and `PrefixWindowRule` for UNBOUNDED
   PRECEDING. This adds the third sibling, `HaloRowRule`, for bounded ROWS frames:
   
   ```sql
   avg(v2) OVER (ORDER BY id3 ROWS BETWEEN 100 PRECEDING AND CURRENT ROW)
   ```
   
   On h2o window q6 at 1e7 that window is 10.03s of a 19.33s wall clock, in a stage
   of exactly one task: stage 0's writer declares `UnknownPartitioning`, so the SPM
   above the reader collapses 8 partitions to 1 and BWAG does the whole window alone.
   
   ## Why the RANGE halo does not extend to ROWS
   
   `ParallelWindowRule`'s halo is a value delta end to end: files route by sketched
   `[min, max]` overlap against `cuts[k] +/- halo`, and `RangeFilterExec` keeps
   `cuts[k-1] - halo_lo <= v < cuts[k] + halo_hi`. A ROWS halo is a rank delta, and
   nothing on that path expresses rank. Widening a cut by any value can land in a gap
   holding no rows at all, so "100 preceding rows" is not reachable by a choice of
   value width.
   
   ## Where the rank bound comes from
   
   The range shuffle sidecar index from #2364 carries one row per IPC message, with
   that message's first key and its `num_rows`. Merging those index rows descending by
   first key, across every candidate file, and accumulating `num_rows` until the total
   reaches `n` gives a key: reading from it up to the cut yields a superset of the true
   `n` predecessors. Comparison only, so strings, timestamps, multi-column and DESC
   keys all work. A message straddling the cut counts as zero, since over-counting
   would stop the walk short of the rows asked for.
   
   The walk runs at two granularities:
   
   - **coarse, on the scheduler**, at file granularity, over `key_min` / `key_max` /
     `num_rows` the runtime stats reports already carry. This fetches nothing, and it
     is what keeps the file list per consumer from growing with K.
   - **fine, on the consumer**, at message granularity, over the index files
     `RangeShuffleReaderExec` already downloads. This is byte reduction, not
     correctness.
   
   Cuts stay approximate KLL value cuts. Halo exactness rests on the index walk's exact
   `num_rows`, not on cut exactness.
   
   ## What does not change
   
   `OrderedRangeRepartitionExec`, `RangeFilterExec` and `PartitionedBoundedWindowAggExec`
   learn nothing about ROWS. The filter takes a resolved half-open band per partition,
   which is what it already takes; the rank lives entirely in the scheduler-side walk
   that produces those bands. Only the rule's frame-units gate mentions ROWS at all.
   
   ## State of this PR
   
   Draft, and deliberately incomplete: the rewrite fires and the halo is still zero.
   `ballista/client/tests/halo_row.rs` runs the standalone cluster against single-node
   DataFusion as the oracle, at K=4 over 48 unique keys:
   
   - `the_rewrite_actually_fires`: green. ORRE, RuntimeStatsExec, RangeFilterExec and
     PBWAG all present.
   - `CURRENT ROW AND CURRENT ROW`: green. No row from outside a task's own range is
     needed, so this isolates the plan shape.
   - `5 PRECEDING AND CURRENT ROW`: red on 15 rows, the first 5 after each of the 3
     cuts. That is `(K-1) * n`, and nothing else in the answer moves. The halo is the
     only defect.
   
   Next commit is the coarse walk, which turns that test green without an index fetch
   or a reader change.
   
   Behaviour changes only for queries in the matched shape, and only when
   `ballista.planner.parallel_window.enabled` is set, which defaults to false. The rule
   shares that flag with `ParallelWindowRule` rather than adding a second knob.
   


-- 
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: github-unsubscribe@datafusion.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: github-unsubscribe@datafusion.apache.org
For additional commands, e-mail: github-help@datafusion.apache.org


Re: [PR] feat(scheduler): parallel bounded ROWS-frame windows via a rank-derived halo [datafusion-ballista]

Posted by "github-actions[bot] (via GitHub)" <gi...@apache.org>.
github-actions[bot] commented on PR #2392:
URL: https://github.com/apache/datafusion-ballista/pull/2392#issuecomment-6431810198

   Thank you for your contribution. Unfortunately, this pull request is stale because it has been open 60 days with no activity. Please remove the stale label or comment or this will be closed in 7 days.


-- 
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: github-unsubscribe@datafusion.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: github-unsubscribe@datafusion.apache.org
For additional commands, e-mail: github-help@datafusion.apache.org