假设我做这样的事情:
def readDataset: Dataset[Row] = ???
val ds1 = readDataset.cache();
val ds2 = ds1.withColumn("new", lit(1)).cache();
ds2
和ds1
会共享列中除添加到ds2
的“ new”之外的所有数据吗?如果我同时缓存两个数据集,它将把整个数据集ds
和ds2
存储在内存中,还是将共享数据仅存储一次?
如果共享数据,那么当此[[共享被破坏(因此相同的数据存储在两个存储位置中?)时?
我知道数据集和rdds是不可变的,但是无论是否共享数据,我都找不到清晰的答案。缓存的数据将不会共享。
具有可在Spark UI中找到的代码段和相应的内存使用情况的说服力的实验证明:val df = spark.range(10000000).cache()
val df2 = df.withColumn("other", col("id")*3)
df2.count()
使用约10MB的内存:while
val df = spark.range(10000000).cache() val df2 = df.withColumn("other", col("id")*3).cache() df2.count()
使用约30MB:
df
:10MBdf2
:复制的列为10MB,新列为10MB: