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

Spark 2.1.1:特定格式字符串转时间戳存入Hive遇空值问题

嘿,我来帮你搞定这个问题!你遇到的null问题,核心是没有指定正确的时间格式字符串,而且Spark 2.1.1对自定义时间格式的转换有特定的写法,我给你一步步说清楚:

首先,你原来的格式字符串yyyymmddhhMMss写错了!正确的格式应该是yyyyMMddHHmmss,这里的大小写很关键:

  • yyyy:4位年份
  • MM:2位月份(必须大写,小写mm代表分钟)
  • dd:2位日期
  • HH:24小时制的小时(大写,小写hh是12小时制,如果你是24小时制的时间,用hh会直接解析失败)
  • mm:2位分钟(小写)
  • ss:2位秒数

在Spark 2.1.1中,因为还没有Spark 2.2及以后版本的to_timestamp带格式重载,所以我们需要用unix_timestamp函数先把字符串按指定格式解析成Unix时间戳(秒数),再转换成timestamp类型。

给你完整的代码示例,假设你的原始字符串列名叫originTimeStr:

import org.apache.spark.sql.functions._

// 转换格式并生成timestamp列
val df2 = df.withColumn("originTimeStamp", 
  unix_timestamp($"originTimeStr", "yyyyMMddHHmmss").cast("timestamp")
)

或者你也可以用from_unixtime先转成日期字符串再cast,效果完全一致:

val df2 = df.withColumn("originTimeStamp", 
  from_unixtime(unix_timestamp($"originTimeStr", "yyyyMMddHHmmss")).cast("timestamp")
)

转换完成后,建议先执行df2.show()验证一下originTimeStamp列是否有正确的值,再保存到Hive表,这样就不会出现null了。

另外要注意,如果原始字符串里有不符合yyyyMMddHHmmss格式的内容(比如月份是13、日期是32),转换后还是会得到null,所以要确保原始数据的格式是规范的哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:09:39