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

