Apache spark 为什么Dataset.unpersist级联到所有依赖的缓存数据集?

Apache spark 为什么Dataset.unpersist级联到所有依赖的缓存数据集?,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我使用的是spark 2.3.2。对于我的用例,我缓存第一个数据帧,然后缓存第二个数据帧 试图复制同样的东西 scala> val df = spark.range(1, 1000000).withColumn("rand", (rand * 100).cast("int")).cache df: org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] = [id: bigint, rand: int] scala> df.co

我使用的是spark 2.3.2。对于我的用例,我缓存第一个数据帧,然后缓存第二个数据帧

试图复制同样的东西

scala> val df = spark.range(1, 1000000).withColumn("rand", (rand * 100).cast("int")).cache
df: org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] = [id: bigint, rand: int]

scala> df.count
res0: Long = 999999                                                             

scala> val aggDf = df.groupBy("rand").agg(count("id") as "count").cache
aggDf: org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] = [rand: int, count: bigint]

scala> aggDf.count
res1: Long = 100   
如下图所示,每个数据帧有两个RDD

现在,当我要取消持久化我的第一个数据帧时,spark将同时取消持久化

df.unpersist()
为了理解这种奇怪的行为,为什么spark同时取消了两个数据帧而不是第一个
我错过什么了吗

引用:

这是故意的。我们不想使用无效的缓存数据

当前的缓存设计需要保证查询的正确性。如果要保留缓存的数据,即使数据已过时。您需要通过将其保存为表来具体化它

但是,在2.4.0中已在以下方面进行了更改:

在使缓存无效时,我们会使依赖于此缓存的其他缓存无效,以确保缓存的数据是最新的。例如,当基础表被修改或表本身被删除时,所有使用该表的缓存都应该失效或刷新

然而,在其他情况下,比如当用户只想删除缓存以释放内存时,我们不需要使依赖缓存失效,因为没有更改任何底层数据。因此,我们想引入一种新的缓存失效模式:非级联缓存失效

由于您使用的是2.3.2,因此必须按照建议保存到表或升级到2.4.0