我对 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()
那么我是否需要缓存数据帧 A 以提高性能?
提前致谢。
最佳答案
是的,你是对的。
您应该将 A 缓存为用于 B 和 C 作为输入。 DAG 可视化将显示重用或返回源的程度(在这种情况下)。如果您有一个嘈杂的集群,则可能会发生一些溢出到磁盘的情况。
另请参阅此处的最佳答案 (Why) do we need to call cache or persist on a 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
使用 .cache 查看 UI
并且没有 .cache
QED:所以,.cache 有好处。否则就没有意义了。此外,在某些情况下,2 次读取可能会导致不同的结果。
关于apache-spark - 为多次引用该数据帧的单个 Action Spark 应用程序缓存数据帧是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59178418/