PySpark如何从包含美元符号的Struct字段中提取日期值
PySpark如何从包含美元符号的Struct字段中提取日期值
嗨,我来帮你搞定这个问题!从带美元符号的Struct字段里取值确实有点小坑,不过PySpark里有几种简单的方法可以解决:
方法1:使用方括号语法访问特殊字段名
因为$date里的$是特殊字符,直接用.点语法(比如df.entrytimestamp.$date)会报错,这时候可以用方括号来访问子字段:
from pyspark.sql.functions import col # 提取$date字段,并重命名为友好的名称 result_df = df.select( col("id"), col("PART_ID"), col("entrytimestamp")["$date"].alias("entry_date") )
这样就能顺利取出entrytimestamp结构体里的$date值,而且如果entrytimestamp本身是null,提取结果也会自动是null,不用额外处理空值。
方法2:使用getItem()方法
另一种等价的方式是用Struct字段的getItem()方法,同样支持带特殊符号的字段名:
result_df = df.select( col("id"), col("PART_ID"), col("entrytimestamp").getItem("$date").alias("entry_date") )
额外建议:将字符串日期转为Timestamp类型
你的$date字段是字符串格式(比如"2024-12-01 00:00:00.047+0000"),如果后续需要做日期相关的计算,可以把它转换成PySpark的Timestamp类型,用to_timestamp()函数配合对应的格式串即可:
from pyspark.sql.functions import to_timestamp df_with_timestamp = df.select( col("id"), col("PART_ID"), to_timestamp(col("entrytimestamp")["$date"], "yyyy-MM-dd HH:mm:ss.SSSZ").alias("entry_timestamp") )
这里的格式串"yyyy-MM-dd HH:mm:ss.SSSZ"完全匹配你的日期格式,其中SSS对应毫秒部分,Z对应时区偏移(比如+0000)。
备注:内容来源于stack exchange,提问作者user3008410
相关产品推荐
相关产品推荐

