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

Spark Scala中如何将字符串类型日期转换为Datetime对象

Scala Spark 解析指定格式字符串为Date/Timestamp 实现方案

你提供的日期格式Tue Dec 31 07:14:22 +0000 2013对应的解析模式串为EEE MMM dd HH:mm:ss Z yyyy,由于包含英文的星期、月份缩写,解析时必须指定英文Locale,否则会出现解析失败的问题。

推荐方案(Spark 3.x 及以上版本)

直接使用Spark内置的to_timestamp、to_date函数实现,无需自定义UDF,性能远高于自定义UDF,适合大数据量场景:

  • 导入依赖包
import org.apache.spark.sql.functions.{to_date, to_timestamp}
import java.util.Locale
  • 字段转换,假设原始字符串字段名为raw_date_str
// 可在Spark会话初始化时指定全局时区,避免日期偏移
spark.conf.set("spark.sql.session.timeZone", "UTC")

val resultDf = df
  // 转换为Timestamp类型,可直接用于建索引
  .withColumn("timestamp_col", to_timestamp($"raw_date_str", "EEE MMM dd HH:mm:ss Z yyyy", Locale.US))
  // 如果只需要Date类型,可基于Timestamp字段二次转换
  .withColumn("date_col", to_date($"timestamp_col"))

兼容方案(Spark 2.x 版本)

Spark 2.x的内置to_timestamp不支持传入Locale参数,需要自定义UDF实现解析:

import org.apache.spark.sql.functions.udf
import java.time.format.DateTimeFormatter
import java.time.LocalDateTime
import java.util.Locale

// 定义解析UDF
val parseDateUdf = udf((dateStr: String) => {
  val formatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss Z yyyy", Locale.US)
  LocalDateTime.parse(dateStr, formatter)
})

// 执行转换
val resultDf = df
  .withColumn("timestamp_col", parseDateUdf($"raw_date_str").cast("timestamp"))
  .withColumn("date_col", to_date($"timestamp_col"))

注意:如果转换后出现日期偏移问题,优先检查Spark会话时区配置,保证和你业务使用的时区一致即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:45:06