PySpark: Как извлечь переменные из структуры, вложенной в структуру внутри массива? - PullRequest
0 голосов
/ 21 января 2020

Ниже приведен игрушечный пример, представляющий собой подмножество моей реальной схемы данных. Я сократил это для краткости.

Я хочу создать фрейм данных PySpark, который содержит 3 поля: ID, Type и TIMESTAMP, которые я бы затем сохранил как таблицу Hive. Я борюсь с кодом PySpark для извлечения соответствующих столбцов.

 |-- Records: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- FileID: long (nullable = true)
 |    |    |-- SrcFields: struct (nullable = true)
 |    |    |    |-- ID: string (nullable = true)
 |    |    |    |-- Type: string (nullable = true)
 |    |    |    |-- TIMESTAMP: string (nullable = true)

До сих пор я представляю, что мое решение должно выглядеть примерно так:

from pyspark.sql.functions import col, explode

df.withColumn("values", explode("values")).select(
  "*", col("values")["name"].alias("name"), col("values")["id"].alias("id")
)

Однако решение выше не ' Я не учел дополнительное вложение моего сценария использования, и я не могу понять, какой дополнительный синтаксис требуется.

1 Ответ

1 голос
/ 22 января 2020

В PySpark вы можете получить доступ к подполям структуры, используя точечную запись. Так что-то вроде этого должно работать:

  1. Разнесение массива
  2. Использование точечной нотации для получения подполей структуры
(
  df.withColumn("values", explode("Records"))
  .select(
    col("values.SrcFields.ID").alias("id"), 
    col("values.SrcFields.Type").alias("type"), 
    col("values.SrcFields.TIMESTAMP").alias("timestamp")
  )
)
...