apache / apache/datafusion

`ProjectionExec` produces unknown statistics for all `ScalarFunctionExpr` outputs

Aperta
#21,307 4 commenti 0 reazioni 0 assegnatari Vedi su GitHub
enhancement
Lingua principale
Rust
Stelle
9.3k
Fork
2.4k
Merge medio
3g 11h
PR unite (30g)
360

Descrizione

### Is your feature request related to a problem or challenge?

`ProjectionExec::project_statistics()` only propagates column statistics for plain `Column` references and `Literal` values. Any `ScalarFunctionExpr` like `get_field()`, `variant_get`, or any UDF produces `ColumnStatistics::new_unknown()`:

https://github.com/apache/datafusion/blob/bc2b36cf56846e0c697b0f8b98619f346a72a9bf/datafusion/physical-expr/src/projection.rs#L716-L719

This means every column produced by a scalar function has `Absent` min/max/null_count/distinct_count, even when the function is a pure extraction (`get_field`, `variant_get`), a monotonic transformation (`cast`, `abs`), or any UDF where output stats are derivable from input stats

### Describe the solution you'd like

Add an optional method to `ScalarUdfImpl`:

something like `fn output_statistics(&self, input_statistics: &[ColumnStatistics]) -> Option`

This way, `ProjectionExec::project_statistics` would call this before falling back to unknown

### How this affects Struct + Variant queries

This matters for struct/variant queries especially, most output columns come through `get_field` or equivalent UDFs, so the cost model is effectively blind!

- **cost based join ordering** can't estimate cardinality for join keys produced by udfs
- **aggregation planning** can't estimate group count for group by on udf outputs
- **filterexec selectivity** - can't narrow row estimates for filters on udf outputs

Here's an MRE: https://github.com/apache/datafusion/compare/main...pydantic:datafusion:stats-propagation-mre?expand=1

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

Inizia da datafusion/physical-expr/src/projection.rs, in ProjectionExec::project_statistics(), quindi segui l’interfaccia ScalarUdfImpl utilizzata da ScalarFunctionExpr. Usa l’MRE collegato per osservare le statistiche di get_field(), variant_get e di altri output UDF. Il lavoro è completato quando le statistiche di output derivabili vengono propagate, mentre le funzioni non supportate continuano a ricadere su statistiche sconosciute.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
rust
Ambito
data-engineering
Tipo di issue
Funzionalità
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Tranquilla
Chiarezza
Abbastanza chiara
Idoneità per principianti
48/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.