我有一个dataframe,需要从中创建一个新的dataframe,并通过执行以下操作对模式进行少量更改。
>>> X = spark.createDataFrame([[1,2], [3,4]], ['a', 'b'])
>>> schema_new = X.schema.add('id_col', LongType(), False)
>>> _X = X.rdd.zipWithIndex().map(lambda l: list(l[0]) + [l[1]]).toDF(schema_new)
问题是,在上面的操作中,X
的模式就地更改。所以当我打印X.columns
时
>>> X.columns
['a', 'b', 'id_col']
但是X
中的值仍然相同
>>> X.show()
+---+---+
| a| b|
+---+---+
| 1| 2|
| 3| 4|
+---+---+
为了避免更改X
的模式,我尝试使用三种方法创建X
的副本
-使用copy
模块中的copy
和deepcopy
方法
-简单地使用_X = X
copy
方法失败并返回
RecursionError: maximum recursion depth exceeded
分配方法也不起作用
>>> _X = X
>>> id(_X) == id(X)
True
由于它们的id
是相同的,因此在这里创建一个重复的数据帧并没有真正的帮助,对_X
执行的操作反映在X
中。
所以我的问题是
如何更改模式输出(即不更改X
)?
更重要的是,如何创建pyspark数据帧的副本?
注意:
这个问题是这个post的后续问题
在斯卡拉:
正如在对另一个问题的回答中所解释的,您可以对初始模式进行深度复制。然后我们可以修改该副本并使用它初始化新的
DataFrame
_X
:现在让我们检查一下:
输出:
请注意,要复制
DataFrame
,只需使用_X = X
。每当您使用withColumn
添加一个新列时,对象不会就地更改,而是返回一个新副本。 希望这有帮助!相关问题 更多 >
编程相关推荐