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

Spark DataFrame中字符串转YYYY-MM-DD格式日期类型的实现方法咨询

Spark DataFrame 英文缩写日期字符串转YYYY-MM-DD格式实现方案

核心原理

你的原始字符串Mon Jan 09 2021对应的结构化日期模板为EEE MMM dd yyyy,转换核心是先将字符串解析为Spark原生日期类型,再按需格式化为yyyy-MM-dd格式的字符串即可。
绝大多数转换失败的原因是未指定英文Locale,Spark默认使用操作系统本地Locale(中文环境下无法识别Mon、Jan这类英文缩写,会直接返回null)。

代码示例

PySpark 版本

from pyspark.sql import SparkSession
from pyspark.sql.functions import to_date, date_format

# 初始化SparkSession时指定英文Locale和时区,避免解析异常
spark = SparkSession.builder \
    .appName("date_convert_demo") \
    .config("spark.sql.session.timeZone", "UTC") \
    .config("spark.sql.locale", "en_US") \
    .getOrCreate()

# 构造示例测试数据
test_df = spark.createDataFrame([("Mon Jan 09 2021",), ("Tue Feb 16 2021",)], ["raw_date"])

# 生成日期类型新字段,Spark输出展示时默认就是YYYY-MM-DD格式
test_df = test_df.withColumn("date_col", to_date("raw_date", "EEE MMM dd yyyy"))

# 若需要得到字符串类型的YYYY-MM-DD格式字段,新增如下转换
test_df = test_df.withColumn("date_str_col", date_format("date_col", "yyyy-MM-dd"))

test_df.show(truncate=False)

Scala Spark 版本

import org.apache.spark.sql.functions.{to_date, date_format}
import java.util.Locale

// 构造测试数据
val test_df = Seq(
  "Mon Jan 09 2021", 
  "Tue Feb 16 2021"
).toDF("raw_date")

// 显式传入Locale.US适配英文日期缩写,避免中文环境解析失败
val res_df = test_df
  .withColumn("date_col", to_date($"raw_date", "EEE MMM dd yyyy", Locale.US))
  .withColumn("date_str_col", date_format($"date_col", "yyyy-MM-dd"))

res_df.show(false)

常见踩坑说明

  • 格式模板写错:月份缩写对应MMM,不要写成代表分钟的mm;星期缩写对应EEE,不要漏写
  • 时区配置错误:未指定时区可能导致跨零点的日期出现偏移
  • 未指定英文Locale:这是最常见的返回null的原因,中文环境下无法识别英文星期、月份缩写

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:36:03