SPARK:尽管进行了缓存,仍产生了相同的阶段

时间:2018-11-02 16:31:19

标签: scala apache-spark apache-spark-sql

我想知道,尽管我在Spark中的每个操作之前都缓存了数据,但我如何才能拥有两个完全相同的阶段。 您能看一下下面的屏幕截图,它对我来说很奇怪。这是否意味着我在阶段中执行了两次任务?

不幸的是,很难给出代码示例,但是我将尝试解释我的工作。

  1. 从CSV读取数据
  2. 对特定列进行一些转换。
  3. 应用模式-> spark.Session.createDataFrame(df.rdd,schema)
  4. 通过在第3点创建的DF上使用不同的过滤器来创建7个新的数据框
  5. 出于比较的原因,从第4点获取两个数据帧,并将它们传递给另一种方法。

在第2点和第4点之后,我坚持只比较了两个数据帧。比较后不坚持。比较是一个漫长而复杂的过程。

enter image description here

1 个答案:

答案 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中,缓存非常迫切,因为您没有调用任何操作来触发缓存,所以这对查询性能产生了巨大的影响。