.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()
,因为它是一个无用的,不必要的请求?
1条答案
按热度按时间vlf7wbxs1#
在Apache Spark中,该高速缓存()操作是一个前瞻性操作,它在执行操作时标记要缓存的DataFrame。然而,在您的示例中:
字符串
的变换在该高速缓存()调用之后应用于sdf的(filter,withColumn,select)将不会被缓存。缓存应该在转换之后完成,以避免重新计算。当您执行像show()这样的操作时,Spark将重新计算DataFrame,缓存将在此时发生。该高速缓存()仅在操作触发计算时发生。但在您的示例中,即使sdf被缓存,每次你叫一个动作,你会再一次计算:
型
I wrote an article that shows you how to cache wisely.