You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:01:08