Library User Guide

Extending Operators

qianmoQqianmoQ· 更新于 2026-09-22· 阅读 6 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

Extending Operators#

DataFusion supports extending operators by transforming LogicalPlan and ExecutionPlan through customized optimizer rules. This section will use the µWheel project to illustrate such capabilities.

About DataFusion µWheel#

DataFusion µWheel is a native DataFusion optimizer which improves query performance for time-based analytics through fast temporal aggregation and pruning using custom indices. The integration of µWheel into DataFusion is a joint effort with the DataFusion community.

Optimizing Logical Plan#

The rewrite function transforms logical plans by identifying temporal patterns and aggregation functions that match the stored wheel indices. When match is found, it queries the corresponding index to retrieve pre-computed aggregate values, stores these results in a MemTable, and returns as a new LogicalPlan::TableScan. If no match is found, the original plan proceeds unchanged through DataFusion’s standard execution path.

fn rewrite(
  &self,
  plan: LogicalPlan,
  _config: &dyn OptimizerConfig,
) -> Result<Transformed<LogicalPlan>> {
    // Attempts to rewrite a logical plan to a uwheel-based plan that either provides
    // plan-time aggregates or skips execution based on min/max pruning.
    if let Some(rewritten) = self.try_rewrite(&plan) {
        Ok(Transformed::yes(rewritten))
    } else {
        Ok(Transformed::no(plan))
    }
}
// Converts a uwheel aggregate result to a TableScan with a MemTable as source
fn agg_to_table_scan(result: f64, schema: SchemaRef) -> Result<LogicalPlan> {
  let data = Float64Array::from(vec![result]);
  let record_batch = RecordBatch::try_new(schema.clone(), vec![Arc::new(data)])?;
  let df_schema = Arc::new(DFSchema::try_from(schema.clone())?);
  let mem_table = MemTable::try_new(schema, vec![vec![record_batch]])?;
  mem_table_as_table_scan(mem_table, df_schema)
}

To get a deeper dive into the usage of the µWheel project, visit the blog post by Max Meldrum.

评论

登录后参与评论

正在加载评论…