Apache spark 如果Spark中的数据帧是不可变的,为什么我们能够使用诸如withColumn()之类的操作来修改它?

Apache spark 如果Spark中的数据帧是不可变的,为什么我们能够使用诸如withColumn()之类的操作来修改它?,apache-spark,pyspark,Apache Spark,Pyspark,这可能是一个源自我无知的愚蠢问题。我已经在PySpark上工作了几个星期,一开始没有太多编程经验 我的理解是,在Spark中,RDD、数据帧和数据集都是不可变的——我再次理解,这意味着您无法更改数据。如果是这样,为什么我们能够使用withColumn()?编辑数据帧的现有列;文件明确指出 如果在column打开的情况下保留一个引用调用的数据帧的变量,它将不会有新的列。根据Spark体系结构,数据帧构建在RDD之上,RDD本质上是不可变的,因此数据帧本质上也是不可变的 关于withColumn或

这可能是一个源自我无知的愚蠢问题。我已经在PySpark上工作了几个星期,一开始没有太多编程经验


我的理解是,在Spark中,RDD、数据帧和数据集都是不可变的——我再次理解,这意味着您无法更改数据。如果是这样,为什么我们能够使用
withColumn()

编辑数据帧的现有列;文件明确指出


如果在column打开的情况下保留一个引用调用的数据帧的变量,它将不会有新的列。

根据Spark体系结构,数据帧构建在RDD之上,RDD本质上是不可变的,因此数据帧本质上也是不可变的


关于withColumn或任何其他操作,当您对数据帧应用此类操作时,它将生成一个新的数据帧,而不是更新现有的数据帧

但是,当您使用动态类型语言python时,您会覆盖前面引用的值。因此,当您执行下面的语句时

df = df.withColumn()
它将生成另一个数据帧并将其分配给引用“
df

为了验证这一点,您可以使用rdd的
id()
方法来获取数据帧的唯一标识符

df.rdd.id()

将为您的数据帧提供唯一标识符

我希望上面的解释能有所帮助

问候,


Neeraj

Spark的核心数据结构,即RDD本身是不可变的。这种性质与Java中的字符串非常相似,它也是不可变的。 当您用另一个文本连接一个字符串时,您不是在修改原始字符串,而是在创建一个新的字符串。
类似地,无论是数据帧还是数据集,只要您通过添加列或删除列来更改RDD,您就不会更改其中的任何内容,而是在创建一个新的数据集/数据帧。

我认为,当您使用
with column
时,您实际上创建了一个新的数据帧,不修改当前数据帧。类似的东西在PySpark中不起作用吗
dataframe=dataframe.withColumn(“col1”),when(col(“col1”)=“val1”,“V”)。否则(col(“col1”))
对语法不太确定。可以重新分配变量,但这并不意味着原始值会改变。任何整数都是可变的,因为您可以编写
i=i+1
。相比之下,python列表是可变的:。“当您对数据帧应用这些操作时,它将生成一个新的数据帧”-也可能没有创建新的副本,而创建的只是原始数据帧的一个“视图”。我们无法确定,因为数据帧是不可变的。