在Synapse Analytics中用PySpark读取数据湖表时无法解析时间戳列(拒绝LEGACY模式)
问题解决:Spark 3.0 日期格式解析错误(非LEGACY模式)
问题原因
错误中的日期字符串是10/27/2022 1:14:31 PM,包含12小时制的AM/PM标识,你之前使用的格式字符串M/dd/yyyy h:m:s缺少了AM/PM的匹配规则,且to_date函数仅能解析日期部分,无法处理带时间和AM/PM的完整字符串,导致解析失败。
解决方案
1. 精准匹配日期时间格式
使用to_timestamp函数(而非to_date),格式字符串添加a来匹配AM/PM标识,同时修正时间部分的格式占位符:
from pyspark.sql.functions import col, to_timestamp # 转换带AM/PM的完整时间戳字符串 df = df.withColumn("SinkCreatedOn", to_timestamp(col("SinkCreatedOn"), "M/dd/yyyy h:mm:ss a")) df = df.withColumn("SinkModifiedOn", to_timestamp(col("SinkModifiedOn"), "M/dd/yyyy h:mm:ss a"))
若仅需日期部分,可在转换为时间戳后再转为日期类型:
from pyspark.sql.functions import col, to_timestamp, to_date df = df.withColumn("SinkCreatedOn", to_date(to_timestamp(col("SinkCreatedOn"), "M/dd/yyyy h:mm:ss a"))) df = df.withColumn("SinkModifiedOn", to_date(to_timestamp(col("SinkModifiedOn"), "M/dd/yyyy h:mm:ss a")))
2. 兼容多种格式(若数据存在格式差异)
如果数据中存在多种日期时间格式,可使用coalesce函数尝试多种格式匹配:
from pyspark.sql.functions import col, to_timestamp, coalesce # 定义可能的日期格式列表 formats = ["M/dd/yyyy h:mm:ss a", "MM/dd/yyyy hh:mm:ss a", "M/d/yyyy h:mm:ss a"] # 对目标列尝试所有格式,取第一个解析成功的结果 df = df.withColumn("SinkCreatedOn", coalesce(*[to_timestamp(col("SinkCreatedOn"), f) for f in formats])) df = df.withColumn("SinkModifiedOn", coalesce(*[to_timestamp(col("SinkModifiedOn"), f) for f in formats]))
3. 验证转换结果
转换完成后,可通过以下代码确认解析是否成功:
df.select("SinkCreatedOn", "SinkModifiedOn").show(truncate=False)
关键提示
- Spark 3.0+的日期解析器严格遵循格式完全匹配,必须覆盖字符串中的所有元素(包括AM/PM标识)
to_date仅处理纯日期字符串,带时间的字符串必须先通过to_timestamp转换为时间戳类型,再按需转换
内容的提问来源于stack exchange,提问作者Arthur Walsh
相关产品推荐
相关产品推荐

