Spark(Scala)中如何将字符串格式时间戳转为日期对象?
Spark Scala 转换特定格式时间戳字符串为日期/时间戳对象
格式字符串说明
你的时间戳格式是Thu Sep 12 06:54:21 +0000 2013,对应的Java SimpleDateFormat格式字符串为:EEE MMM dd HH:mm:ss Z yyyy
各部分含义:
EEE: 英文星期缩写(如Thu)MMM: 英文月份缩写(如Sep)dd: 两位日期(如12)HH: 24小时制的两位小时(如06)mm: 两位分钟(如54)ss: 两位秒数(如21)Z: 时区偏移量(如+0000)yyyy: 四位年份(如2013)
完整Scala代码示例
import org.apache.spark.sql.SparkSession import org.apache.spark.sql.functions.{to_timestamp, to_date} object TimestampConversion { def main(args: Array[String]): Unit = { val spark = SparkSession.builder() .appName("TimestampConversion") .master("local[*]") // 本地测试用,生产环境移除该配置 .getOrCreate() import spark.implicits._ // 构造示例DataFrame val df = Seq( "Thu Sep 12 06:54:21 +0000 2013", "Thu Sep 12 06:59:12 +0000 2013", "Thu Sep 12 07:01:22 +0000 2013" ).toDF("created_at") // 转换为带时分秒的Timestamp类型 val dfWithTimestamp = df.withColumn( "created_timestamp", to_timestamp($"created_at", "EEE MMM dd HH:mm:ss Z yyyy") ) // 转换为仅含年月日的Date类型 val dfWithDate = dfWithTimestamp.withColumn( "created_date", to_date($"created_at", "EEE MMM dd HH:mm:ss Z yyyy") ) // 打印结果 dfWithDate.show(false) spark.stop() } }
兼容低版本Spark的方案
如果你的Spark版本低于3.0,需要用unix_timestamp + from_unixtime组合实现转换:
import org.apache.spark.sql.functions.{unix_timestamp, from_unixtime} val dfWithTimestamp = df.withColumn( "created_timestamp", from_unixtime(unix_timestamp($"created_at", "EEE MMM dd HH:mm:ss Z yyyy")) )
注意事项
- 若出现解析失败,大概率是JVM语言环境不支持英文缩写,可在SparkSession初始化时指定:
val spark = SparkSession.builder() .appName("TimestampConversion") .master("local[*]") .config("spark.sql.session.timeZone", "UTC") .config("spark.driver.extraJavaOptions", "-Duser.language=en -Duser.country=US") .config("spark.executor.extraJavaOptions", "-Duser.language=en -Duser.country=US") .getOrCreate()
内容的提问来源于stack exchange,提问作者person
相关产品推荐
相关产品推荐

