在 Hive 中将 Long 转换为时间戳
Posted
技术标签:
【中文标题】在 Hive 中将 Long 转换为时间戳【英文标题】:Convert Long to Timestamp in Hive 【发布时间】:2018-02-22 14:11:16 【问题描述】:我想将 spark 应用程序的启动时间存储到表中。因此尝试了以下代码:
scala> val i = sc.startTime
i: Long = 1519308048128
这个查询在YYYY-MM-DD HH:M:SS.sss
中给出了正确的时间戳。但是如果我在带有 spark.sql
的插入语句中使用它,NULL
值将被插入到目标表中。
spark.sql("
insert into table TST_DT
select from_unixtime(CAST($i/1000 AS bigint),'YYYY-MM-DD HH:MM:SS.SSS')
from temp limit 1")
可定位的TST_DT
仅有数据类型为Timestamp
的列
我尝试在 hive 中使用 cast
函数,结果仍然相同:-
spark.sql("
insert into table TST_DT
select cast(from_unixtime(CAST($i/1000 AS bigint),'YYYY-MM-DD HH:MM:SS.SSS')
as timestamp) from temp limit 1")
【问题讨论】:
【参考方案1】:您的日期格式字符串不正确。参考SimpleDataFormat
val df = sc.parallelize(Seq(sc.startTime/1000)).toDF("ts")
df.withColumn("ts" , from_unixtime($"ts" , "yyyy-MM-dd HH:mm:ss.SSS") ).show(false)
+-----------------------+
|ts |
+-----------------------+
|2018-02-22 05:35:19.000|
+-----------------------+
df.withColumn("ts" , from_unixtime($"ts" , "YYYY-MM-DD HH:MM:SS.SSS") ).show(false)
+-----------------------+
|ts |
+-----------------------+
|2018-02-53 05:02:00.000|
+-----------------------+
到目前为止一切都很好,因为from_unixtime
返回一个字符串。但只要你把它投射到timestamp
:
df.withColumn("ts" , from_unixtime($"ts" , "yyyy-MM-dd HH:mm:ss.SSS") )
.selectExpr("cast(ts as timestamp)").show
+-------------------+
| ts|
+-------------------+
|2018-02-22 05:35:19|
+-------------------+
df.withColumn("ts" , from_unixtime($"ts" , "YYYY-MM-DD HH:MM:SS.SSS") )
.selectExpr("cast(ts as timestamp)").show
+----+
| ts|
+----+
|null|
+----+
【讨论】:
以上是关于在 Hive 中将 Long 转换为时间戳的主要内容,如果未能解决你的问题,请参考以下文章