【问题标题】:Convert Long to Timestamp in Hive在 Hive 中将 Long 转换为时间戳
【发布时间】:2026-01-21 23:40:01
【问题描述】:

我想将 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")

【问题讨论】:

    标签: hadoop apache-spark hive apache-spark-sql


    【解决方案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|
    +----+
    

    【讨论】:

      最近更新 更多