У меня есть датафрейм со схемой:
root
|-- col2: integer (nullable = true)
|-- col1: integer (nullable = true)
|-- structCol3: struct (nullable = true)
| |-- structField2: boolean (nullable = true)
| |-- structField1: string (nullable = true)
|-- structCol3: struct (nullable = true)
| |-- nestedArray: array (nullable = true)
| | |-- element: struct (containsNull = true)
| | | |-- elem3: double (nullable = true)
| | | |-- elem2: string (nullable = true)
| | | |-- elem1: string (nullable = true)
| |-- structField2: integer (nullable = true)
и из-за проблем с совместимостью я пытаюсь вывести его в формате паркета, но в следующем формате:
root
|-- col1: integer (nullable = true)
|-- col2: integer (nullable = true)
|-- structCol3: struct (nullable = true)
| |-- structField1: string (nullable = true)
| |-- structField2: boolean (nullable = true)
|-- structCol4: struct (nullable = true)
| |-- nestedArray: array (nullable = true)
| | |-- element: struct (containsNull = true)
| | | |-- elem1: string (nullable = true)
| | | |-- elem2: string (nullable = true)
| | | |-- elem3: double (nullable = true)
| |-- structField2: integer (nullable = true)
До сих пор я успешно переставлял столбцы и поля внутри структур следующим образом:
dfParquetOutput = df.select(
"col1",
"col2",
struct(
col("structCol3.structField1"),
col("structCol3.structField2")
).alias("structCol3"),
struct(
col("structCol4.nestedArray"),
col("structCol4.structField2")
).alias("structCol4")
)
К сожалению, я изо всех сил пытаюсь найти способ переупорядочить элементы внутри StructType, который находится внутри массива. Я думал о том, чтобы попытаться использовать udf, но из-за того, что я новичок в зажигании, у меня не получилось добиться успеха. Я также пытался создать новый фрейм данных с предопределенной схемой, но в моих тестах столбцы назначались на основе позиции, а не имени.
Есть ли простой способ переупорядочить Struct внутри массива.