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

Spark 3.5.0含星期的datetime字符串解析问题(无需LEGACY模式)

PySpark 3.5.0/Databricks 14.3 解析含星期的时间字符串问题解决

问题描述

要解析的时间字符串为:Fri, 23 Aug 2024 12:11:16 GMT,按照官方文档给出的模式EEE, dd MMM yyyy HH:mm:ss 'GMT'调用to_timestamp时触发SparkUpgradeException,但移除星期部分的模式后可正常解析。需要在不设置LEGACY解析策略的前提下解决该问题。

解决方案

Spark 3.0+默认启用STRICT时间戳解析策略,该策略会严格校验星期与日期的对应关系,问题根源通常是默认区域设置(Locale)不匹配,导致Spark无法正确识别英文星期/月份缩写。以下是几种可行方案:

1. 解析时显式指定英文Locale

在to_timestamp中通过locale参数指定en_US,确保英文星期和月份缩写被正确识别并通过校验:

from pyspark.sql.functions import to_timestamp, col

df = df.withColumn(
    "parsed_timestamp",
    to_timestamp(
        col("raw_datetime"),
        format="EEE, dd MMM yyyy HH:mm:ss 'GMT'",
        locale="en_US"
    )
)

2. 截取核心日期部分后解析

如果不想依赖Locale设置,可以直接跳过字符串中的星期部分,只解析有效日期时间内容:

from pyspark.sql.functions import to_timestamp, col, substring

# 从第5位开始截取(跳过"Fri, "前缀)
df = df.withColumn(
    "parsed_timestamp",
    to_timestamp(
        substring(col("raw_datetime"), 5, 25),  # 固定长度截取目标日期段:"23 Aug 2024 12:11:16 GMT"共25位
        format="dd MMM yyyy HH:mm:ss 'GMT'"
    )
)

3. 全局设置Spark会话的Locale

如果需要所有时间解析都生效,可以在初始化SparkSession时配置默认Locale:

from pyspark.sql import SparkSession

spark = SparkSession.builder \
    .appName("datetime-parse") \
    .config("spark.sql.locale", "en_US") \
    .config("spark.sql.session.timeZone", "GMT")  # 匹配时间字符串的时区
    .getOrCreate()

配置完成后,直接使用原模式调用to_timestamp即可正常解析。

原因解析

Spark的STRICT解析策略要求星期缩写必须与对应日期严格匹配,若系统默认Locale不是英文,Spark无法识别Fri、Aug这类英文缩写,导致校验失败抛出SparkUpgradeException。通过指定英文Locale或规避星期部分的校验,就能在保持STRICT模式的前提下解决问题。

内容的提问来源于stack exchange,提问作者BackInBlack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 08:11:02