PySpark:如何从嵌套在数组内结构中的结构中提取变量?

PySpark: How to extract variables from a struct nested in a struct inside an array?

以下是一个玩具示例,它是我的实际数据架构的一个子集。为了简洁起见,我将其缩写。

我希望构建一个包含 3 个字段的 PySpark 数据框:IDTypeTIMESTAMP,然后我将其保存为 Hive Table。我正在努力使用 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")
)

但是,上面的解决方案没有考虑到我的用例的额外嵌套,我无法弄清楚所需的额外语法。

在 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")
  )
)