Изменить схему фрейма данных на другую схему

#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)