我想知道,尽管我在Spark中的每个操作之前都缓存了数据,但我如何才能拥有两个完全相同的阶段。 您能看一下下面的屏幕截图,它对我来说很奇怪。这是否意味着我在阶段中执行了两次任务?
不幸的是,很难给出代码示例,但是我将尝试解释我的工作。
spark.Session.createDataFrame(df.rdd,schema)
在第2点和第4点之后,我坚持只比较了两个数据帧。比较后不坚持。比较是一个漫长而复杂的过程。
答案 0 :(得分:0)
您可以使用说明运算符(其中InMemoryRelation实体以其存储级别反映缓存的数据集)来查看是否在您的物理计划中缓存了DataFrame:
== 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中的缓存有一个惊喜。缓存是懒惰的,这就是为什么您要付出额外的代价才能让行缓存第一个操作,但这仅在DataFrame API中发生。在SQL中,缓存非常迫切,因为您没有调用任何操作来触发缓存,所以这对查询性能产生了巨大的影响。