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
相关产品推荐
相关产品推荐

