我觉得这很容易......
在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
答案 0 :(得分:1)
(我在这里提供答案。)
答案是使用cast()
。这适用于date
和timestamp
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;