我有一个数据框,需要通过执行以下操作从中创建一个新的数据框,其架构中的更改很小。
>>> 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
模块中的deepcopy
和copy
方法
-只需使用_X = X
copy
方法失败并返回
RecursionError: maximum recursion depth exceeded
分配方法也不起作用
>>> _X = X
>>> id(_X) == id(X)
True
由于它们的id
是相同的,因此在这里创建重复的数据帧并没有真正的帮助,并且在_X
上执行的操作会反映在X
中。
所以我的问题确实有两个方面
如何更改架构范围(即不对X
进行任何更改)?
,更重要的是,如何创建pyspark数据框的副本?
注意:
这个问题是对此post
的跟进答案 0 :(得分:5)
.alias()
通常用于重命名列,但它也是 a DataFrame method 并且会给你你想要的:
df2 = df.alias('df2')
id(df2) == id(df) # False
答案 1 :(得分:2)
如果您需要创建 pyspark 数据帧的副本,您可能会使用 Pandas。
schema = X.schema
X_pd = X.toPandas()
_X = spark.createDataFrame(X_pd,schema=schema)
del X_pd
答案 2 :(得分:1)
在Scala中: