У меня есть фрейм данных, из которого мне нужно создать новый фрейм данных с небольшим изменением схемы, выполнив следующую операцию.
>>> 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?
Примечание:
Этот вопрос является продолжением этой записи