PySpark中转换Struct内Date字段时保留Struct类型的方法
问题描述
原DataFrame的Schema如下:
|—- id: long |—- user: struct |—- name: string |—- date: string
执行以下代码后:
df = df.select( F.col("id"), F.col("user.name"), F.col("user.date").cast("date") )
得到的Schema变成了:
|—- id: long |—- user.name: string |—- user.date: date
如何在转换user.date字段类型的同时,不丢失user的struct结构?期望的输出Schema为:
|—- id: long |—- user: struct |—- name: string |—- date: date
解决方案
方法1:用withColumn更新struct内部字段
直接通过withColumn重新构建user结构体,保留原有字段并转换date类型:
from pyspark.sql import functions as F df = df.withColumn( "user", F.struct( F.col("user.name"), F.col("user.date").cast("date").alias("date") ) )
方法2:用select配合struct重构字段
如果需要同时指定顶级字段(比如id),可以在select语句里直接组合新的user结构体:
df = df.select( F.col("id"), F.struct( F.col("user.name"), F.col("user.date").cast("date").alias("date") ).alias("user") )
两种方法都能在完成date字段类型转换的同时,保留user的struct层级结构。
内容的提问来源于stack exchange,提问作者OdiumPura
相关产品推荐
相关产品推荐

