如果Spark中的数据帧是不可变的,为什么我们可以使用withColumn()之类的操作对其进行修改?

时间:2018-11-19 11:56:58

标签: apache-spark pyspark

这可能是一个愚蠢的问题,源于我的无知。我已经在PySpark上工作了几周,并且没有太多的编程经验。

我的理解是,在Spark中,RDD,数据帧和数据集都是不可变的-再次理解,这意味着您无法更改数据。如果是这样,为什么我们可以使用withColumn()编辑数据框的现有列?

3 个答案:

答案 0 :(得分:3)

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

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

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

df = df.withColumn()

它将生成另一个数据帧,并将其分配给引用“ df”。

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

df.rdd.id()

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

希望以上说明对您有帮助。

此致

Neeraj

答案 1 :(得分:2)

您不是;该文档明确指出

  

Returns a new Dataset by adding a column or replacing the existing column that has the same name.

如果保留引用您调用withColumn的数据框的变量,则该变量将没有新列。

答案 2 :(得分:1)

Spark 的 Core Data 结构,即 RDD 本身是不可变的。这种性质与 Java 中的字符串非常相似,它也是不可变的。 当您将一个字符串与另一个文字连接时,您不是在修改原始字符串,而是实际上是在创建一个新字符串。 同样,无论是 Dataframe 还是 Dataset,无论何时通过添加列或删除列来更改该 RDD,您都不会更改其中的任何内容,而是创建了一个新的 Dataset/Dataframe。