Spark DataFrames/Datasets 在缓存时共享数据吗?

Krz*_*sik 4 scala dataset apache-spark rdd

假设我做这样的事情:

def readDataset: Dataset[Row] = ???

val ds1 = readDataset.cache();

val ds2 = ds1.withColumn("new", lit(1)).cache();
Run Code Online (Sandbox Code Playgroud)

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

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

我知道数据集和 rdds 是不可变的,但是如果共享数据,我找不到明确的答案。

bon*_*nzo 5

简而言之:缓存的数据不会被共享

使用 Spark UI 中的代码片段和相应的内存使用情况来说服您的实验证明:

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

使用大约 10MB 的内存:

在此处输入图片说明

尽管

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

使用大约 30MB:

  • df:10MB
  • for df2: 10MB 用于复制的列,另外 10MB 用于新列:

在此处输入图片说明