Spark DataFrames/Datasets缓存时是否共享数据?

4

假设我做了类似这样的事情:

def readDataset: Dataset[Row] = ???

val ds1 = readDataset.cache();

val ds2 = ds1.withColumn("new", lit(1)).cache();
ds2ds1除了"new"列之外的所有列数据会共享吗?如果我缓存两个数据集,那么整个数据集dsds2是否都将保存在内存中,还是只存储共享数据一次?
如果数据被共享,那么什么情况下会破坏这种共享(即相同的数据存储在两个内存位置中)?
我知道数据集和rdd是不可变的,但我找不到明确的答案来解释它们是否共享数据。
1个回答

5
简而言之:缓存数据不会被共享
通过实验证明,使用代码片段和相应的内存使用情况来说服您,这可以在Spark UI中找到:
val df = spark.range(10000000).cache()
val df2 = df.withColumn("other", col("id")*3)
df2.count()

使用约10MB的内存:

输入图像描述

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接