сглаживание массива структуры в pyspark

У меня есть файл XML, преобразованный в фрейм данных с использованием пакета spark-xml. Фрейм данных имеет следующую структуру:

root
 |-- results: struct (nullable = true)
 |    |-- result: struct (nullable = true)
 |    |    |-- categories: struct (nullable = true)
 |    |    |    |-- category: array (nullable = true)
 |    |    |    |    |-- element: struct (containsNull = true)
 |    |    |    |    |    |-- value: string (nullable = true)

если я выберу столбец категории (который может появляться несколько раз под категориями):

df.select((col('results.result.categories.category')).alias("result_categories"))

Для одной записи результат будет выглядеть так:

[[result1], [result2]]

Я пытаюсь сгладить результаты:

[result1, result2]

Когда я использую функцию сглаживания, я получаю сообщение об ошибке:

df.select(flatten(col('results.result.categories.category')).alias("Hits_Category"))
 cannot resolve 'flatten(`results`.`result`.`categories`.`category`)' due to data type mismatch: The argument should be an array of arrays, but '`results`.`result`.`categories`.`category`' is of array<struct<value:string>

В итоге я создаю udf и передаю столбец udf, который выводит версию столбца с плоской строкой.

Есть ли способ лучше?


person user2773013    schedule 24.02.2020    source источник


Ответы (1)


Вы пытаетесь применить функцию flatten для массива структур, ожидая массив массивов:

flatten(arrayOfArrays) - Преобразует массив массивов в единый массив.

Вам не нужен UDF, вы можете просто transform элементы массива от структуры к массиву затем используют flatten.

Что-то вроде этого:

df.select(col('results.result.categories.category').alias("result_categories"))\
  .withColumn("result_categories", expr("transform(result_categories, x -> array(x.*))"))\
  .select(flatten(col("result_categories")).alias("Hits_Category"))\
  .show()
person blackbishop    schedule 24.02.2020