`ProjectionExec` produces unknown statistics for all `ScalarFunctionExpr` outputs
- 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