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

时间:2017-10-21 23:15:21

标签: hive apache-spark-sql

我觉得这很容易......

在Hive / SparkSQL中,如何将unix时间戳[注1]转换为timestamp 数据类型?

(注1:即自1970年1月1日以来的秒数/毫秒数)

我认为from_unixtime()会这样做,但它会返回一个字符串 而不是时间戳。以下实验说明了问题

第0步:准备

select 
  from_unixtime(1508673584) as fut;

结果:

-----------------------
| fut                 |
| ------------------- |
| 2017-10-22 11:59:44 |
-----------------------

第1步:创建一个结果为from_unixtime()

的表格
create table test
select 
  from_unixtime(1508673584) as fut;

第2步:检查列fut

的数据类型
describe test;

结果:

----------------------------------
| col_name | data_type | comment |
| -------- | --------- | ------- |
| fut      | string    | <null>  |
----------------------------------

我也试过这个

select 
  from_utc_timestamp(1508618794*1000, 'EDT');

根据手册(链接here),这应该有效。因为它 说:

  

将UTC中的时间戳*转换为给定时区(从Hive 0.8.0开始)。 *   timestamp是一种原始类型,包括时间戳/日期,   tinyint / smallint / int / bigint,float / double和decimal。部分的   值被视为秒。整数值被视为   毫秒..例如from_utc_timestamp(2592000.0,'PST'),   from_utc_timestamp(2592000000,'PST')和from_utc_timestamp(时间戳)   '1970-01-30 16:00:00','PST')全部返回时间戳1970-01-30   8时00分零零秒

然而,我收到了错误

Error: org.apache.spark.sql.AnalysisException: 
  cannot resolve 'from_utc_timestamp((1508618794 * 1000), 'EDT')' 
  due to data type mismatch: 
  argument 1 requires timestamp type, 
  however, '(1508618794 * 1000)' is of int type.; line 2 pos 2;
'Project [unresolvedalias(from_utc_timestamp((1508618794 * 1000), EDT), None)]
+- OneRowRelation$

SQLState:  null
ErrorCode: 0    

2 个答案:

答案 0 :(得分:1)

(我在这里提供答案。)

答案是使用cast()。这适用于datetimestamp

select 
  from_unixtime(1508673584)                    as fut,
  cast(from_unixtime(1508673584) as date)      as futAsDate,
  cast(from_unixtime(1508673584) as timestamp) as futAsTimestamp;

结果:

------------------------------------------------------------
| fut                 | futAsDate  | futAsTimestamp        |
| ------------------- | ---------- | --------------------- |
| 2017-10-22 11:59:44 | 2017-10-22 | 2017-10-22 11:59:44.0 |
------------------------------------------------------------

验证数据类型

create table test2
select 
  from_unixtime(1508673584)                    as fut,
  cast(from_unixtime(1508673584) as date)      as futAsDate,
  cast(from_unixtime(1508673584) as timestamp) as futAsTimestamp;

然后

describe test2;  

结果:

----------------------------------------
| col_name       | data_type | comment |
| -------------- | --------- | ------- |
| fut            | string    | <null>  |
| futAsDate      | date      | <null>  |
| futAsTimestamp | timestamp | <null>  |
----------------------------------------

答案 1 :(得分:1)

创建表测试AS 选择强制转换(from_unixtime(1508673584)作为时间戳)作为fut;