PySpark中时间戳列转换为null的原因及解决方法
PySpark中to_timestamp返回null的原因及解决办法
问题场景
在Azure Databricks的Python笔记本中运行以下PySpark代码时,第三行的myTimeStampCol1字段返回null值:
代码示例
from pyspark.sql.functions import * df=spark.createDataFrame(data = [ ("1","Arpit","2021-07-24 12:01:19.000"),("2","Anand","2019-07-22 13:02:20.000"),("3","Mike","11-16-2021 18:00:08")], schema=["id","Name","myTimeStampCol"]) df.select(col("myTimeStampCol"),to_timestamp(col("myTimeStampCol"),"yyyy-MM-dd HH:mm:ss.SSSS").alias("myTimeStampCol1")).show()
运行输出
+--------------------+-------------------+ |myTimeStampCol | myTimeStampCol1| +--------------------+-------------------+ |2021-07-24 12:01:...|2021-07-24 12:01:19| |2019-07-22 13:02:...|2019-07-22 13:02:20| | 11-16-2021 18:00:08| null| +--------------------+-------------------+
实际场景为导入百万级数据文件,其中日期列格式统一为MM-dd-yyyy HH:mm:ss。
原因分析
- 第三行的时间字符串格式是
MM-dd-yyyy HH:mm:ss,但代码中to_timestamp指定的解析格式是yyyy-MM-dd HH:mm:ss.SSSS,格式完全不匹配,导致解析失败返回null。 - 前两行的时间字符串是
yyyy-MM-dd HH:mm:ss.SSSS格式(带毫秒后缀),和指定的解析格式匹配,所以能正常转换为时间戳。
解决办法
由于实际数据的日期格式统一为MM-dd-yyyy HH:mm:ss,同时存在部分数据带毫秒后缀的情况,可使用可选格式语法(用方括号包裹可选部分)来兼容两种格式,修改to_timestamp的格式参数即可:
修改后的代码
from pyspark.sql.functions import * df=spark.createDataFrame(data = [ ("1","Arpit","2021-07-24 12:01:19.000"),("2","Anand","2019-07-22 13:02:20.000"),("3","Mike","11-16-2021 18:00:08")], schema=["id","Name","myTimeStampCol"]) # 使用兼容带/不带毫秒的格式模式 df.select(col("myTimeStampCol"),to_timestamp(col("myTimeStampCol"),"MM-dd-yyyy HH:mm:ss[.SSSS]").alias("myTimeStampCol1")).show()
预期输出
+--------------------+-------------------+ |myTimeStampCol |myTimeStampCol1 | +--------------------+-------------------+ |2021-07-24 12:01:...|2021-07-24 12:01:19| |2019-07-22 13:02:...|2019-07-22 13:02:20| |11-16-2021 18:00:08 |2021-11-16 18:00:08| +--------------------+-------------------+
内容的提问来源于stack exchange,提问作者nam
相关产品推荐
相关产品推荐

