Вы можете увидеть, был ли DataFrame кэширован в вашем физическом плане, используя оператор объяснения (где сущности InMemoryRelation отражают кэшированные наборы данных с их уровнем хранения):
== Physical Plan ==
*Project [id#0L, id#0L AS newId#16L]
+- InMemoryTableScan [id#0L]
+- InMemoryRelation [id#0L], true, 10000, StorageLevel(disk, memory, deserialized, 1 replicas)
+- *Range (0, 1, step=1, splits=Some(8))
После того, как вы кэшируете (или сохраняете) свой DataFrame, первый запрос может стать медленнее, но он окупится за следующие запросы.
Вы можете проверить, был ли кеширован набор данных или нет, используя следующий код:
scala> :type q2
org.apache.spark.sql.Dataset[org.apache.spark.sql.Row]
val cache = spark.sharedState.cacheManager
scala> cache.lookupCachedData(q2.queryExecution.logical).isDefined
res0: Boolean = false
Есть один сюрприз с кэшированием в Spark SQL. Кэширование лениво, и поэтому вы платите дополнительную цену за кэширование строк при самом первом действии, но это происходит только с API DataFrame. В SQL кэширование требует больших усилий, что сильно влияет на производительность запросов, поскольку вы не вызываете действие для запуска кэширования.