Scala/Spark环境下如何将datetime列转换为EpochTime格式
Scala/Spark 环境 datetime 列转 EpochTime 实现方案
报错原因分析
你编写的代码报错有两个核心问题:
dataDB.select("Date")返回的是DataFrame类型对象,而非具体的时间值,本身不存在getEpochSecond方法- 若
Date列是字符串类型,需要先转换为时间类型才能调用时间相关方法
推荐实现方案
方案1:使用 Spark 内置函数批量处理(最推荐)
该方案不需要手动调用Java类,适配Spark分布式处理场景,性能最优:
import org.apache.spark.sql.functions._ val resultDF = dataDB // 第一步:将字符串类型的时间列转换为Timestamp类型,第二个参数填你实际的时间格式 // 如果你给出的示例值是真实格式,格式串为 "yyyy-MM-dd'T'HH:mm:ss" // 如果你声明的 "yyyy-MMM-dd-HH:mm:ss" 是真实格式直接替换即可 .withColumn("datetime_ts", to_timestamp(col("Date"), "yyyy-MM-dd'T'HH:mm:ss")) // 第二步:转换为秒级Epoch时间戳,返回Long类型 .withColumn("epoch_second", unix_timestamp(col("datetime_ts")))
如果需要毫秒级Epoch时间戳,直接将unix_timestamp(col("datetime_ts"))修改为unix_timestamp(col("datetime_ts")) * 1000即可。
方案2:单值处理/UDF场景下调用Java Time类
Scala完全兼容Java类库,不存在适配问题,需要先解析字符串为时间对象再调用getEpochSecond:
import java.time.LocalDateTime import java.time.format.DateTimeFormatter import java.time.ZoneOffset // 自定义时间格式解析示例 val formatter = DateTimeFormatter.ofPattern("yyyy-MMM-dd-HH:mm:ss") val datetimeStr = "2013-Dec-31-05:14:22" val epochSecond: Long = LocalDateTime.parse(datetimeStr, formatter) .toEpochSecond(ZoneOffset.UTC) // 可替换为你需要的时区参数
如果是标准ISO格式的时间字符串(和你给出的示例值一致),可以直接用Instant.parse简化代码:
import java.time.Instant val datetimeStr = "2013-12-31T05:14:22" val epochSecond: Long = Instant.parse(datetimeStr).getEpochSecond
内容的提问来源于stack exchange,提问作者Al-Meqdad Jabi
相关产品推荐
相关产品推荐

