Pyspark中将string类型转换为datetime类型时结果始终为null的问题
Pyspark字符串转日期时间类型结果为null的解决方法
问题对应场景参考截图:
解决方法
- 严格匹配格式串
Pyspark的to_date、to_timestamp转换函数要求传入的格式模式和字符串实际格式完全一致,且大小写敏感:MM代表月份,mm代表分钟HH代表24小时制小时,hh代表12小时制小时- 带
T分隔符的ISO格式要对应写yyyy-MM-dd'T'HH:mm:ss
示例代码:
from pyspark.sql.functions import to_timestamp # 假设原字段date_str格式为 年/月/日 时:分:秒 df = df.withColumn("datetime_col", to_timestamp("date_str", "yyyy/MM/dd HH:mm:ss")) - 先清洗字符串异常内容
日期字符串前后空格、不可见特殊字符都会导致转换失败,转换前先用trim、regexp_replace清洗字段:from pyspark.sql.functions import trim, regexp_replace, to_timestamp # 先移除前后空格,再过滤多余的特殊符号 df = df.withColumn("clean_date_str", trim(regexp_replace("date_str", "[^0-9\\-: /]", ""))) \ .withColumn("datetime_col", to_timestamp("clean_date_str", "yyyy-MM-dd HH:mm:ss")) - 适配时区规则
如果日期字符串带时区标识,需要在格式串中加入对应占位符,或者显式指定时区参数:# 适配带Z的UTC格式日期 df = df.withColumn("datetime_col", to_timestamp("date_str", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")) # 显式指定时区 df = df.withColumn("datetime_col", to_timestamp("date_str", "yyyy-MM-dd HH:mm:ss").alias("dt", metadata={"timezone": "Asia/Shanghai"})) - 快速验证格式正确性
拿单条样本数据测试格式串是否匹配,快速定位问题:
如果测试返回结果不为null则格式正确,反之调整格式串即可。# 替换引号内的内容为你的实际日期字符串和待验证格式串 spark.sql("SELECT to_timestamp('2024-05-20 18:30:00', 'yyyy-MM-dd HH:mm:ss') AS test_result").show()
内容的提问来源于stack exchange,提问作者Alejandro Fleitas
相关产品推荐
相关产品推荐

