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

Python PySpark:如何从嵌套在数组中的结构中提取变量?,python,dataframe,pyspark,apache-spark-sql,pyspark-dataframes,Python,Dataframe,Pyspark,Apache Spark Sql,Pyspark Dataframes,下面是一个玩具示例,它是我实际数据模式的子集。为了简洁,我把它缩写了 我希望构建一个PySpark数据框架,其中包含3个字段:ID、Type和TIMESTAMP,然后将其保存为配置单元表。我正在努力使用PySpark代码来提取相关列 |-- Records: array (nullable = true) | |-- element: struct (containsNull = true) | | |-- FileID: long (nullable = true)

下面是一个玩具示例,它是我实际数据模式的子集。为了简洁,我把它缩写了

我希望构建一个PySpark数据框架,其中包含3个字段:
ID
Type
TIMESTAMP
,然后将其保存为配置单元表。我正在努力使用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中,您可以使用点表示法访问结构的子字段。因此,类似这样的方法应该有效:

  • 爆炸阵列
  • 使用点表示法获取struct的子字段

  • 你能提供一些示例数据吗?
    “由于数据类型不匹配,无法解析”explode(
    values
    )”:explode函数的输入应该是数组或映射类型,而不是struct
    @user2205916抱歉,explode函数中当然应该是数组列。我编辑了答案。如何使用点访问MapType列中的键/值?
    (
      df.withColumn("values", explode("Records"))
      .select(
        col("values.SrcFields.ID").alias("id"), 
        col("values.SrcFields.Type").alias("type"), 
        col("values.SrcFields.TIMESTAMP").alias("timestamp")
      )
    )