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

