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

Clo*_*ave 6 python apache-spark apache-spark-sql pyspark

我有一个数据框,通过执行以下操作,需要从该数据框创建一个新的数据框,并在架构中进行了少量更改。

>>> 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)
Run Code Online (Sandbox Code Playgroud)

问题在于,在上述操作中,的架构已X就地更改。所以,当我打印X.columns,我得到

>>> X.columns
['a', 'b', 'id_col']
Run Code Online (Sandbox Code Playgroud)

但其中的值X仍然相同

>>> X.show()
+---+---+
|  a|  b|
+---+---+
|  1|  2|
|  3|  4|
+---+---+
Run Code Online (Sandbox Code Playgroud)

为了避免更改的架构X,我尝试X使用以下三种方式创建副本:使用copy和模块中的deepcopy方法copy-简单地使用_X = X

copy方法失败,返回

RecursionError: maximum recursion depth exceeded
Run Code Online (Sandbox Code Playgroud)

分配方法也不起作用

>>> _X = X
>>> id(_X) == id(X)
True
Run Code Online (Sandbox Code Playgroud)

由于它们id是相同的,因此在这里创建重复的数据框实际上并没有帮助,并且在上完成的操作也_X反映在中X

所以我的问题确实有两个

  • 如何更改架构(即无需对进行任何更改X)?

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

注意:

这个问题是这篇文章的后续内容

Flo*_*ian 6

正如在另一个问题的答案中所解释的,您可以对初始架构进行深层复制。然后我们可以修改该副本并使用它来初始化新的DataFrame _X

import pyspark.sql.functions as F
from pyspark.sql.types import LongType
import copy

X = spark.createDataFrame([[1,2], [3,4]], ['a', 'b'])
_schema = copy.deepcopy(X.schema)
_schema.add('id_col', LongType(), False) # modified inplace
_X = X.rdd.zipWithIndex().map(lambda l: list(l[0]) + [l[1]]).toDF(_schema)
Run Code Online (Sandbox Code Playgroud)

现在让我们检查一下:

print('Schema of X: ' + str(X.schema))
print('Schema of _X: ' + str(_X.schema))
Run Code Online (Sandbox Code Playgroud)

输出:

Schema of X: StructType(List(StructField(a,LongType,true),StructField(b,LongType,true)))
Schema of _X: StructType(List(StructField(a,LongType,true),
                  StructField(b,LongType,true),StructField(id_col,LongType,false)))
Run Code Online (Sandbox Code Playgroud)

请注意,要复制 aDataFrame您只需使用_X = X. 每当您使用 eg 添加新列时withColumn,对象不会就地更改,但会返回一个新副本。希望这可以帮助!


toz*_*CSS 5

.alias()常用于重命名列,但它也是一种 DataFrame 方法,会给你你想要的:

df2 = df.alias('df2')
id(df2) == id(df)  # False
Run Code Online (Sandbox Code Playgroud)

  • 我正在使用天蓝色 databricks 6.4 。数据帧的 ID 不同,但由于初始数据帧是增量表的选择,因此使用您的技巧的该数据帧的副本仍然是该增量表的选择;-)。 (2认同)