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

Scala中无分隔符日期字符串转日期格式问题求助

解决Spark中解析ddMMyyyy格式日期返回null的问题

嗨,我来帮你搞定这个日期解析的问题!你遇到的返回null的情况,大概率是两个核心原因之一:原列的数据类型不对,或者存在不符合格式的脏数据,咱们一步步来排查解决。

首先排查:原列的数据类型是否正确

如果你的reporting_date列是**数值类型(比如int、long)**而非字符串类型,Spark的to_date函数是没法直接解析的——它需要字符串格式的输入才能匹配ddMMyyyy的格式规则。这很可能是你得到null的主要原因。

针对性解决方案:先转字符串再解析

直接修改你的代码,先把列转换成字符串类型,再进行日期解析和格式化:

import org.apache.spark.sql.functions.{col, to_date, date_format, cast}
import org.apache.spark.sql.types.StringType

df.withColumn("reporting_date", 
    date_format(
        to_date(col("reporting_date").cast(StringType), "ddMMyyyy"), 
        "yyyy-MM-dd"
    )
).show()

其次检查:是否存在不符合格式的脏数据

如果原列已经是字符串类型,但还是返回null,那可能是某些行的日期值不符合ddMMyyyy的格式要求(比如长度不是8位、日期逻辑错误,比如出现13月、32日这类无效值)。

排查脏数据的小技巧

可以先过滤出不符合8位长度的行,快速定位异常值:

df.filter(length(col("reporting_date")) != 8).show()

如果确实存在脏数据,用when函数做容错处理,避免整列解析失败:

import org.apache.spark.sql.functions.{to_date, when, length}

df.withColumn("formatted_date", 
    when(length(col("reporting_date")) === 8, to_date(col("reporting_date"), "ddMMyyyy"))
      .otherwise(null) // 不符合格式的可以保留null,也可以换成你需要的默认值
  )
  .withColumn("reporting_date", date_format(col("formatted_date"), "yyyy-MM-dd"))
  .drop("formatted_date")
  .show()

最后确认:格式字符串是否正确

再核对下你的格式字符串ddMMyyyy是正确的:

  • dd:两位数的日期(01-31)
  • MM:两位数的月份(01-12)
  • yyyy:四位数的年份
    千万别把MM写成mm(小写mm代表分钟,会直接导致解析完全错误)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:47:36