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 (of SparkPlanner) that translates InMemoryRelation logical operator for cached query plans to a pruned physical plan with InMemoryTableScanExec physical operator.