Can't serialize example `ExecutionPlan` to 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
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