如何在pyspark中创建数据框的副本?

时间:2018-09-12 04:35:10

标签: python apache-spark pyspark apache-spark-sql

我有一个数据框,需要通过执行以下操作从中创建一个新的数据框,其架构中的更改很小。

>>> 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模块中的deepcopycopy方法 -只需使用_X = X

copy方法失败并返回

RecursionError: maximum recursion depth exceeded

分配方法也不起作用

>>> _X = X
>>> id(_X) == id(X)
True

由于它们的id是相同的,因此在这里创建重复的数据帧并没有真正的帮助,并且在_X上执行的操作会反映在X中。

所以我的问题确实有两个方面

  • 如何更改架构范围(即不对X进行任何更改)?

  • ,更重要的是,如何创建pyspark数据框的副本?

注意:

这个问题是对此post

的跟进

3 个答案:

答案 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中:

  1. 使用“ X.schema.copy”创建新的架构实例,而无需进行旧的架构修改;
  2. 在每个返回Dataframe(“选择”,“ where”等)的Dataframe操作中,将创建新的Dataframe,而不修改原始数据。原稿可以反复使用。猜猜,您的案例不需要重复。性能是单独的问题,可以使用“持久”。