Spark Scala中hhmm格式无日期时分时间列对应的数据类型如何选择
结论
截至Spark 3.5版本,Spark Scala没有专门针对仅包含时分(hhmm格式)的单日时间场景的原生专用数据类型,你可以根据业务场景从以下3种常用处理方案中选择:
常用处理方案
方案1:存储为整数类型
直接保存原始的hhmm数值(如1345直接存为Int类型值1345),是性能最优的选择。
优点:存储空间占用小,计算时间差逻辑简单,只需要将数值转换为当日总分钟数即可运算:总分钟数 = (hhmm / 100) * 60 + hhmm % 100
适用场景:仅需要做时间差计算、不需要额外拼接为完整时间戳的场景。方案2:存储为
HH:mm格式字符串
将原始hhmm数值格式化为带冒号分隔的字符串(如1345转为"13:45")。
优点:可读性极强,不需要额外转换即可直接用于报表、前端展示。
适用场景:不需要做复杂时间运算、偏展示类的场景。方案3(Spark 3.4+ 推荐):存储为
DayTimeIntervalType类型
Spark 3.4版本新增了DayTimeIntervalType类型,用于存储一天内的时间间隔,最大精度为秒,完美适配hhmm时分场景的语义需求。
示例转换代码:import org.apache.spark.sql.functions._ import org.apache.spark.sql.types.DayTimeIntervalType // 将Int类型的deptime(如1345)转换为DayTimeIntervalType val processedDf = rawDf.withColumn( "deptime_interval", expr("make_interval(0, 0, 0, 0, cast(deptime / 100 as int), cast(deptime % 100 as int), 0)").cast(DayTimeIntervalType) )优点:语义清晰,支持原生Spark时间运算,比如直接计算到达时间和出发时间的差值、和日期列拼接为完整时间戳:
// 拼接航班日期和出发时间得到完整出发时间戳 processedDf.withColumn( "full_departure_ts", concat(col("flight_date").cast("timestamp"), col("deptime_interval")) )适用场景:Spark版本在3.4及以上,需要做大量时间运算、拼接完整时间戳的场景。
内容的提问来源于stack exchange,提问作者krakken
相关产品推荐
相关产品推荐

