Hive 和 SparkSQL 不支持日期时间类型?

lee*_*wah 5 sql hive apache-spark-sql

是真的,Hive并且SparkSQL不支持 的数据类型datetime吗?

从我对参考文献的阅读来看,它们似乎只支持datetimestamp。前者没有时间分量(即小时、分钟和秒);后者具有高精度(低至毫秒),但不是人类可读的(它总是需要由from_unixtime()or转换date_format(),结果将是一个字符串,而不是一个datetime类型)。

相比之下,其他数据库系统,例如MySQL确实具有datetime. (例如,请参阅此参考

有什么好的建议/技巧来解决这个限制吗?

这些是我的参考:

  1. Hive 语言手册:日期/时间类型
  2. Hive 语言手册:日期函数

更新:关于人类可读性

这里我举一个例子MySQL来说明我关于人类可读性的观点:

-- MySQL code 
select 
  cast(now() as date)         as asDate,          -- human readable
  cast(now() as dateTime)     as asDateTime,      -- human readable  
  unix_timestamp(now())       as asUnixTimestamp, -- not H/R
  cast(from_unixtime(unix_timestamp(now())) 
        as dateTime) 
                              asDateTimeAgain     -- cast into dateTime to make it H/R
Run Code Online (Sandbox Code Playgroud)

显示将是这样的:

(注意第四列asDateTimeAgain,这是人类可读的)

+------------+---------------------+-----------------+---------------------+
| asDate     | asDateTime          | asUnixTimestamp | asDateTimeAgain     |
+------------+---------------------+-----------------+---------------------+
| 2017-10-21 | 2017-10-21 22:37:15 |      1508625435 | 2017-10-21 22:37:15 |
+------------+---------------------+-----------------+---------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

并且限制不仅仅是关于人类可读性。的字符串表示datetime是人类可读的,但随后它失去了 的属性datetime并且 需要进一步转换回datatime日期/时间处理,例如min(), max(),并将值捕获到java.util.Date

-- Hive/SparkSQL  code
select 
  current_date                    asDate,
  unix_timestamp()                asUnixTimestamp,
  from_unixtime(unix_timestamp(), 
    'yyyy-MM-dd HH:mm:ss')        asString
Run Code Online (Sandbox Code Playgroud)

输出是这样的,其中第三列是字符串而不是datetime类型

------------------------------------------------------
| asDate     | asUnixTimestamp | asString            |
| ---------- | --------------- | ------------------- |
| 2017-10-21 | 1508625586      | 2017-10-21 22:39:46 |
------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

lee*_*wah 6

(我在这里自己提供答案)

不要timestamp与“unix 时间戳”混淆

timestamp实际上是人类可读的;而“unix 时间戳”,即自 1970 年 1 月 1 日以来的秒数/毫秒数,确实不是很容易阅读。

但是,我们可以使用cast()转换后者(通过函数from_unixtime())来获得前者。

-- Hive/SparkSQL  code
select 
  current_date                    asDate,          -- human readable
  unix_timestamp()                asUnixTimestamp, -- not human readable
  from_unixtime(unix_timestamp()) asString,        -- human readable
  cast(from_unixtime(unix_timestamp())             
    as date)                      asDate2,         -- human readable
  cast(from_unixtime(unix_timestamp())             
    as timestamp)                 asTimestamp      -- human readable
Run Code Online (Sandbox Code Playgroud)

结果:

-------------------------------------------------------------------------------------------
| asDate     | asUnixTimestamp | asString            | asDate2    | asTimestamp           |
| ---------- | --------------- | ------------------- | ---------- | --------------------- |
| 2017-10-22 | 1508687321      | 2017-10-22 15:48:41 | 2017-10-22 | 2017-10-22 15:48:41.0 |
-------------------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)


Gor*_*off 5

Timestamp做你想做的。我不确定您所说的“人类可读”是什么意思。所有数据库都以内部格式存储日期和日期时间,这与显示格式完全无关。并且——近似地——不同数据库的内部格式是不同的。(维基百科有一篇有趣的文章介绍了不同计算机系统使用的一些不同的“0”日期。)

如果您想以特定方式查看值,请将结果格式化为字符串。Hive 具有用于处理timestamp值的完整字符串函数,并且在需要时可以轻松地将字符串文字转换为时间戳。