PySpark:如何从嵌套在数组内结构中的结构中提取变量?
PySpark: How to extract variables from a struct nested in a struct inside an array?
以下是一个玩具示例,它是我的实际数据架构的一个子集。为了简洁起见,我将其缩写。
我希望构建一个包含 3 个字段的 PySpark 数据框:ID
、Type
和 TIMESTAMP
,然后我将其保存为 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 中,您可以使用点表示法访问结构的子字段。所以这样的事情应该有效:
- 炸开数组
- 使用点符号获取结构的子字段
(
df.withColumn("values", explode("Records"))
.select(
col("values.SrcFields.ID").alias("id"),
col("values.SrcFields.Type").alias("type"),
col("values.SrcFields.TIMESTAMP").alias("timestamp")
)
)
以下是一个玩具示例,它是我的实际数据架构的一个子集。为了简洁起见,我将其缩写。
我希望构建一个包含 3 个字段的 PySpark 数据框:ID
、Type
和 TIMESTAMP
,然后我将其保存为 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 中,您可以使用点表示法访问结构的子字段。所以这样的事情应该有效:
- 炸开数组
- 使用点符号获取结构的子字段
(
df.withColumn("values", explode("Records"))
.select(
col("values.SrcFields.ID").alias("id"),
col("values.SrcFields.Type").alias("type"),
col("values.SrcFields.TIMESTAMP").alias("timestamp")
)
)