PySpark中字符串时间转Timestamp返回None的问题求助
问题排查与解决方案
方法1失败原因
你用的时间格式字符串完全不匹配目标格式:
- 原时间字符串格式是
yyyy-MM-dd HH:mm:ss,SSS(年份在前,毫秒用逗号分隔) - 但你传入的格式是
MM-dd-yyyy HH:mm:ss.SSSS(月份在前,毫秒用点分隔,还多写了一位毫秒位),格式不匹配直接导致转换失败。
方法2失败原因
Spark默认的Timestamp解析规则不支持逗号分隔的毫秒,直接用.cast("timestamp")会因为格式不兼容返回null。
正确实现方式
方式1:修正to_timestamp的格式参数
直接指定和原字符串匹配的格式即可,注意毫秒部分是逗号:
from pyspark.sql.functions import col, regexp_extract, to_timestamp sparkDF.withColumn( "TIMESTAMP", to_timestamp( regexp_extract(col('message'), r'(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2},\d+)', 1), "yyyy-MM-dd HH:mm:ss,SSS" ) ).show()
方式2:替换逗号为点后再转换
先把时间字符串里的逗号换成点,再进行类型转换:
from pyspark.sql.functions import col, regexp_extract, regexp_replace sparkDF.withColumn( "TIMESTAMP", regexp_replace( regexp_extract(col('message'), r'(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2},\d+)', 1), ",", "." ).cast("timestamp") ).show()
最终效果
两种方法都会生成正确的Timestamp列:
+--------------------+-------+-------------------+ | message| class| TIMESTAMP| +--------------------+-------+-------------------+ |2022-10-28 07:46:...|classA|2022-10-28 07:46:59.705| |2022-10-27 10:03:...|classB|2022-10-27 10:03:59.800| +--------------------+-------+-------------------+
内容的提问来源于stack exchange,提问作者peace
相关产品推荐
相关产品推荐

