Hive
和SparkSQL
不支持datetime
的数据类型是真的吗?
从我对参考文献的阅读中,它们似乎只支持date
和timestamp
。前者不是时间成分(即小时,分钟和秒);后者具有高精度(低至毫秒)但不是非常易读(它总是需要from_unixtime()
或date_format()
的转换,结果将是一个字符串,而不是datetime
类型)。
相比之下,其他数据库系统(例如MySQL
)的数据类型为datetime
。 (例如,见ref)
如何解决此限制的任何好建议/提示?
这些是我的参考资料:
更新:人类可读性
这里我举一个关于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
显示如下:
(注意第四列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)
并且限制不仅仅是人类可读性。一个字符串
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
datetime
输出将是这样,其中第三列是字符串而不是
------------------------------------------------------
| asDate | asUnixTimestamp | asString |
| ---------- | --------------- | ------------------- |
| 2017-10-21 | 1508625586 | 2017-10-21 22:39:46 |
------------------------------------------------------
类型
Datum Fotonummer Werkput Vlak Spoornummer Oriëntatie Onderwerp Fotograaf
2011-05-16 1 1 1.0 1 N Vlakfoto Spoor 1 DIM
2011-05-16 2 1 1.0 1 N Vlakfoto Spoor 1 DIM
2011-05-16 3 1 1.0 1 N Vlakfoto Spoor 1 DIM
答案 0 :(得分:4)
Timestamp
做你想要的。我不确定你的意思是什么"人类可读"。所有数据库都以内部格式存储日期和日期时间,这与显示格式完全无关。而且 - 近似 - 内部格式对于不同的数据库是不同的。 (维基百科对不同计算机系统使用的某些不同日期有一个有趣的article。)
如果要以特定方式查看值,请将结果格式化为字符串。 Hive有一整套用于处理timestamp
值的字符串函数,并且在需要时可以轻松地将字符串文字转换为时间戳。
答案 1 :(得分:2)
(我自己在这里提供答案)
请勿将timestamp
与“unix timestamp”混淆
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
结果:
-------------------------------------------------------------------------------------------
| 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 |
-------------------------------------------------------------------------------------------