在蜂巢/ 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 | |
----------------------------------
我也尝试这个
select
from_utc_timestamp(1508618794*1000, 'EDT');
根据手册(链路here),这应该工作。因为它 指出:
覆羽在UTC时间戳*给定的时区(如蜂房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')所有返回的时间戳一九七○年一月三十日 08:00: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