在 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 转换为时间戳的主要内容,如果未能解决你的问题,请参考以下文章

在 Hive 中将字符串转换为时间戳

Hive/SparkSQL:如何将 Unix 时间戳转换为时间戳(不是字符串)?

在 Impala 中将连接的字符串转换为时间戳

在 Excel 中将原始数字转换为时间戳

在Android中将字符串日期转换为时间戳?

php怎么将指定日期转换为时间戳