【发布时间】:2018-09-12 04:35:09
【问题描述】:
我有一个数据框,我需要通过执行以下操作来创建一个新的数据框,并在架构中进行少量更改。
>>> 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 我得到 p>
>>> 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的后续问题
【问题讨论】:
-
我想到的最简单的解决方案是使用
df_copy = original_df.select("*")的解决方法,并且可能添加一些 .cache() 。有意义吗?
标签: python apache-spark pyspark apache-spark-sql