apache / apache/datafusion

Can't serialize example `ExecutionPlan` to substrait

Open
#9,299 4 comments 0 reactions 0 assignees View on GitHub
documentation enhancement substrait
Dominant language
Rust
Stars
9.3k
Forks
2.4k
Avg merge
3d 7h
Merged PRs (30d)
344

Description

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

While working on an example for serializing substrait plans (see https://github.com/apache/arrow-datafusion/pull/9260 PR), I found I could not write an example for serializing an execution plan. The feature is still not complete enough

### Describe the solution you'd like

What I would like:

I would like to add the example (or something like it) to `datafusion/substrait/src/lib.rs` and have
it work.

//! # Example: Serializing [`ExecutionPlan`]s

//!
//! This functionality is still under development and only works for a small subset of plans
//!
//! ```
//! # use datafusion::prelude::*;
//! # use std::collections::HashMap;
//! # use std::sync::Arc;
//! # use datafusion::error::Result;
//! # use datafusion::arrow::array::Int32Array;
//! # use datafusion::arrow::record_batch::RecordBatch;
//! # use datafusion_substrait::physical_plan;
//! # #[tokio::main(flavor = "current_thread")]
//! # async fn main() -> Result<()>{
//! // Create a plan that scans table 't'
//! let ctx = SessionContext::new();
//! let batch = RecordBatch::try_from_iter(vec![("x", Arc::new(Int32Array::from(vec![42])) as _)])?;
//! ctx.register_batch("t", batch)?;
//! let df = ctx.sql("SELECT x from t").await?;
//! let physical_plan = df.create_physical_plan().await?;
//!
//! // Convert the plan into a substrait (protobuf) Rel
//! let mut extension_info= (vec![], HashMap::new());
//! let substrait_plan = physical_plan::producer::to_substrait_rel(physical_plan.as_ref(), &mut extension_info)?;
//!
//! // Decode bytes from somewhere (over network, etc.) back to ExecutionPlan
//! let physical_round_trip = physical_plan::consumer::from_substrait_rel(
//! &ctx, &substrait_plan, &HashMap::new()
//! ).await?;
//! assert_eq!(format!("{:?}", physical_plan), format!("{:?}", physical_round_trip));
//! # Ok(())
//! # }

When you run this test today you get an error about "mem provider not implemented" or something like that

### Describe alternatives you've considered

_No response_

### Additional context

I think making this work would be a matter of implementing serialization of MemTable / MemExec perhaps

Contributor guide

Open the contributing guide

Research direction

Start with the example proposed in datafusion/substrait/src/lib.rs and run it to reproduce the mem provider error. Read the physical_plan producer and consumer paths, focusing on the MemTable/MemExec serialization mentioned in the issue. Done means the example can serialize and deserialize the execution plan and its round-trip assertion succeeds.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
data-engineering
Issue type
Feature
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.