#dataframe #apache-spark #pyspark #apache-spark-sql #pyspark-dataframes
#фрейм данных #apache-spark #apache-spark-sql #pyspark
Вопрос:
У меня есть фрейм данных, который выглядит так
df.printSchema()
root
|-- id: integer (nullable = true)
|-- data: struct (nullable = true)
| |-- foo01 string (nullable = true)
| |-- bar01 string (nullable = true)
| |-- foo02 string (nullable = true)
| |-- bar02 string (nullable = true)
и я хочу преобразовать ее в
root
|-- id: integer (nullable = true)
|-- foo: struct (nullable = true)
| |-- foo01 string (nullable = true)
| |-- foo02 string (nullable = true)
|-- bar: struct (nullable = true)
| |-- bar01 string (nullable = true)
| |-- bar02 string (nullable = true)
Каков наилучший способ сделать это?
Ответ №1:
Вы можете просто использовать функцию struct Pyspark .
from pyspark.sql.functions import struct
new_df = df.select(
'id',
struct('data.foo01', 'data.foo02').alias('foo'),
struct('data.bar01', 'data.bar02').alias('bar'),
)
Дополнительное примечание, связанное с функцией struct Pyspark: она может либо использовать список имен столбцов строк, чтобы перемещать столбцы только в структуру, либо, если вам нужен список выражений.
Комментарии:
1. Спасибо. Я приму этот ответ. Только один дополнительный вопрос, который я не указал в своем первоначальном вопросе: что бы я сделал, если бы захотел переименовать
foo01
вfoo99
?2. Вы можете использовать
struct(F.col('data.foo01').alias('new_name'), F.col('data.foo02').alias('other_new_name'))
Ответ №2:
Вы можете использовать функцию struct с select, как показано ниже:
from pyspark.sql import functions as F
finalDF = df.select( "id",
F.struct("data.foo01", "data.foo02").alias("foo"),
F.struct("data.bar01", "data.bar02").alias("bar")
)
finalDF.printSchema
Схема:
root
|-- id: string (nullable = true)
|-- foo: struct (nullable = false)
| |-- foo01: string (nullable = true)
| |-- foo02: string (nullable = true)
|-- bar: struct (nullable = false)
| |-- bar01: string (nullable = true)
| |-- bar02: string (nullable = true)