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

