Hive和SparkSQL不支持datetime的数据类型是真的吗?
从我对参考资料的阅读来看,它们似乎只支持date和timestamp。前者不是时间组件(即小时、分钟和秒);后者具有很高的精度(下到毫秒),但并不是很容易读懂(它总是需要from_unixtime()或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显示如下:
(请注意第四列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 |
------------------------------------------------------发布于 2017-10-22 15:53:48
(我在这里提供答案)
timestamp 不将与“unix时间戳”混淆。
timestamp实际上是人类可读的;而自1970年1月1日以来的秒/毫秒数"unix时间戳“确实不是很容易读懂。
但是,我们可以使用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 |
-------------------------------------------------------------------------------------------发布于 2017-10-21 13:15:47
Timestamp做你想做的事。我不知道你说的“人类可读性”是什么意思。所有数据库都以内部格式存储日期和日期时间,这与显示格式完全无关。而且--近似地说--不同数据库的内部格式是不同的。(维基百科在不同计算机系统使用的不同"0“日期上有一个有趣的文章。)
如果希望以特定方式查看值,则将结果格式化为字符串。Hive拥有完整的字符串函数,用于处理timestamp值,并在需要时轻松地将字符串文本转换为时间戳。
https://stackoverflow.com/questions/46863547
复制相似问题