pyspark:`.cache`是一个懒惰的函数吗?

bf1o4zei  于 2023-11-21  发布在  Apache
关注(0)|答案(1)|浏览(107)

.cache()是否是一个前瞻性的操作,将应用于在序列结束时创建的任何Spark框架?
假设您加载了一个增量表(这是一个延迟操作),然后应用缓存

sdf = spark.read.format("delta").load("/path/to/my/data")
sdf.cache()

字符串
然后你继续对sdf应用其他懒惰函数。

sdf = sdf.filter("blah blah")
sdf = sdf.withColumn("myvar", blah())
sdf = sdf.select("more blah")


仍然,没有工作发生,懒惰的计算正在等待。
然后你触摸数据框,所有这些懒惰的事情都会发生。

sdf.show()


我应该期待sdf在这之后被缓存吗?
如果不是,Spark是否应该/是否会忽略我的第一个.cache(),因为它是一个无用的,不必要的请求?

vlf7wbxs

vlf7wbxs1#

在Apache Spark中,该高速缓存()操作是一个前瞻性操作,它在执行操作时标记要缓存的DataFrame。然而,在您的示例中:

sdf = spark.read.format("delta").load("/path/to/my/data")
sdf.cache()
sdf = sdf.filter("blah blah")
sdf = sdf.withColumn("myvar", blah())
sdf = sdf.select("more blah")
sdf.show()

字符串
的变换在该高速缓存()调用之后应用于sdf的(filter,withColumn,select)将不会被缓存。缓存应该在转换之后完成,以避免重新计算。当您执行像show()这样的操作时,Spark将重新计算DataFrame,缓存将在此时发生。该高速缓存()仅在操作触发计算时发生。但在您的示例中,即使sdf被缓存,每次你叫一个动作,你会再一次计算:

sdf = sdf.filter("blah blah")
sdf = sdf.withColumn("myvar", blah())
sdf = sdf.select("more blah")


I wrote an article that shows you how to cache wisely.

相关问题