这可能是一个愚蠢的问题,源于我的无知。我已经在PySpark上工作了几周,并且没有太多的编程经验。
我的理解是,在Spark中,RDD,数据帧和数据集都是不可变的-再次理解,这意味着您无法更改数据。如果是这样,为什么我们可以使用withColumn()编辑数据框的现有列?
答案 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。