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

