use*_*916 3 python dataframe apache-spark-sql pyspark
以下是一个玩具示例,它是我的实际数据架构的子集。为简洁起见,我将其缩写。
我希望构建一个包含 3 个字段的 PySpark 数据框: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)
Run Code Online (Sandbox Code Playgroud)
到目前为止,我想我的解决方案应该类似于:
from pyspark.sql.functions import col, explode
df.withColumn("values", explode("values")).select(
"*", col("values")["name"].alias("name"), col("values")["id"].alias("id")
)
Run Code Online (Sandbox Code Playgroud)
但是,上面的解决方案没有考虑到我的用例的额外嵌套,并且我无法找出所需的附加语法。
在 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")
)
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6417 次 |
| 最近记录: |