为单个 Action Spark 应用程序缓存数据帧(在该应用程序中多次引用该数据帧)是否有效?

gan*_*til 6 apache-spark apache-spark-sql

我对 Spark 的缓存机制有点困惑。

假设我有一个 Spark 应用程序,在多次转换结束时只有一个操作。假设我有一个数据帧 A,并对其应用了 2-3 次转换,创建了多个数据帧,这最终有助于创建将保存到磁盘的最后一个数据帧。

例子 :

val A=spark.read() // large size
val B=A.map()
val C=A.map()
.
.
.
val D=B.join(C)
D.save()
Run Code Online (Sandbox Code Playgroud)

那么我是否需要缓存数据帧 A 以增强性能?

提前致谢。

the*_*tom 3

是的,你是对的。

您应该缓存 A,因为它用于 B 和 C 作为输入。DAG 可视化将显示重用或返回源的程度(在本例中)。如果您有一个嘈杂的集群,则可能会发生一些溢出到磁盘的情况。

另请参阅此处的最佳答案(为什么)我们需要调用缓存还是保留在 RDD 上

然而,我正在寻找跳过的阶段,愚蠢的我。但其他内容如下所示。

以下代码类似于您自己的代码:

val aa = spark.sparkContext.textFile("/FileStore/tables/filter_words.txt")//.cache
val a = aa.flatMap(x => x.split(" ")).map(_.trim) 
val b=a.map(x => (x,1)) 
val c=a.map(x => (x,2)) 
val d=b.join(c)
d.count
Run Code Online (Sandbox Code Playgroud)

使用 .cache 查看 UI

在此输入图像描述

并且没有.cache

在此输入图像描述

QED:那么,.cache 有好处。否则就没有意义。此外,在某些情况下,两次读取可能会导致不同的结果。