val spark: SparkSession = ...
// query uses InMemoryRelation logical operator
val q = spark.range(5).cache
val plan = q.queryExecution.optimizedPlan
scala> println(plan.numberedTreeString)
00 InMemoryRelation [id#208L], true, 10000, StorageLevel(disk, memory, deserialized, 1 replicas)
01 +- *Range (0, 5, step=1, splits=8)
// InMemoryScans is an internal class of SparkStrategies
import spark.sessionState.planner.InMemoryScans
val physicalPlan = InMemoryScans.apply(plan).head
scala> println(physicalPlan.numberedTreeString)
00 InMemoryTableScan [id#208L]
01 +- InMemoryRelation [id#208L], true, 10000, StorageLevel(disk, memory, deserialized, 1 replicas)
02 +- *Range (0, 5, step=1, splits=8)
InMemoryScans Execution Planning Strategy
InMemoryScans is an execution planning strategy that plans InMemoryRelation logical operators to InMemoryTableScanExec physical operators.
InMemoryScans is part of the standard execution planning strategies of SparkPlanner.
Applying InMemoryScans Strategy to Logical Plan (Executing InMemoryScans) — apply Method
apply(plan: LogicalPlan): Seq[SparkPlan]
|
Note
|
apply is part of GenericStrategy Contract to generate a collection of SparkPlans for a given logical plan.
|
apply destructures the input logical plan to a InMemoryRelation logical operator.
In the end, apply pruneFilterProject with a new InMemoryTableScanExec physical operator.