lee*_*wah 5 sql hive apache-spark-sql
是真的,Hive并且SparkSQL不支持 的数据类型datetime吗?
从我对参考文献的阅读来看,它们似乎只支持date和timestamp。前者没有时间分量(即小时、分钟和秒);后者具有高精度(低至毫秒),但不是人类可读的(它总是需要由from_unixtime()or转换date_format(),结果将是一个字符串,而不是一个datetime类型)。
相比之下,其他数据库系统,例如MySQL确实具有datetime. (例如,请参阅此参考)
有什么好的建议/技巧来解决这个限制吗?
这些是我的参考:
更新:关于人类可读性
这里我举一个例子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)
(我在这里自己提供答案)
不要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)