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

Spark 3.x 读取含英文全称月份的CSV文件日期解析报错如何解决

问题根因

  • 格式符使用错误:Spark 3.x 采用 Java 8+ 的java.time.DateTimeFormatter作为时间解析器,大写Y代表周年(基于周计数的年份),日常使用的公历年需要用小写y表示。
  • 缺少语言环境配置:英文月份全称MMMM的解析依赖英文locale,默认环境如果是非英文locale会导致解析识别失败。

解决方案

方案一:读取时直接配置参数解析

修改dateFormat为MMMM yyyy,同时新增locale参数指定为英文环境即可,修改后代码如下:

// Creates the schema
StructType schema = DataTypes.createStructType(new StructField[] {
    DataTypes.createStructField(
        "month",
        DataTypes.DateType,
        false),
    DataTypes.createStructField(
        "ct",
        DataTypes.IntegerType,
        true) });

// Reads a CSV file with header
Dataset<Row> df = spark.read().format("csv")
    .option("header", true)
    .option("dateFormat", "MMMM yyyy")
    .option("locale", "en")
    .schema(schema)
    .load("my.csv");

方案二:先读为字符串再显式转换

如果读取时直接解析依然有问题,可以先将日期字段读为字符串类型,再通过to_date函数显式转换:

// 调整schema,将month字段暂设为字符串类型
StructType schema = DataTypes.createStructType(new StructField[] {
    DataTypes.createStructField(
        "month",
        DataTypes.StringType,
        false),
    DataTypes.createStructField(
        "ct",
        DataTypes.IntegerType,
        true) });

// 读取CSV文件
Dataset<Row> rawDf = spark.read().format("csv")
    .option("header", true)
    .schema(schema)
    .load("my.csv");

// 转换字符串为日期类型
Dataset<Row> df = rawDf.withColumn("month", 
    functions.to_date(functions.col("month"), "MMMM yyyy")
);

补充说明

你之前尝试的LLLL YYYY格式中,LLLL是独立语境下的月份全称,英文场景下和MMMM表现一致,解析失败的核心原因依然是年份格式符错误、缺少locale配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 06:45:00