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

