Spark数据帧/数据集在缓存时是否共享数据?

问题描述 投票:3回答:1

假设我做这样的事情:

def readDataset: Dataset[Row] = ???

val ds1 = readDataset.cache();

val ds2 = ds1.withColumn("new", lit(1)).cache();

ds2ds1会共享列中除添加到ds2“ new”之外的所有数据吗?如果我同时缓存两个数据集,它将把整个数据集dsds2存储在内存中,还是将共享数据仅存储一次?

如果共享数据,那么当此[[共享被破坏(因此相同的数据存储在两个存储位置中?)时?

我知道数据集和rdds是不可变的,但是无论是否共享数据,我都找不到清晰的答案。
scala apache-spark dataset rdd
1个回答
4
投票
简而言之:

缓存的数据将不会共享。

具有可在Spark UI中找到的代码段和相应的内存使用情况的说服力的实验证明:

val df = spark.range(10000000).cache() val df2 = df.withColumn("other", col("id")*3) df2.count()

使用约10MB的内存:

enter image description here

while

val df = spark.range(10000000).cache() val df2 = df.withColumn("other", col("id")*3).cache() df2.count()

使用约30MB:

    对于df:10MB
  • 对于df2:复制的列为10MB,新列为10MB:
  • enter image description here
  • © www.soinside.com 2019 - 2024. All rights reserved.