是真的吗 Hive
以及 SparkSQL
不支持的数据类型 datetime
?
从我阅读的参考资料来看,他们似乎只支持 date
以及 timestamp
. 前者没有时间成分(即小时、分钟和秒);后者有很高的精度(低至毫秒),但不是很可读(它总是需要通过 from_unixtime()
或者 date_format()
,结果将是一个字符串,而不是 datetime
类型)。
相反,其他数据库系统,如 MySQL
数据类型为 datetime
. (e、 g.见本参考文件)
有什么好的建议/技巧来克服这个限制吗?
以下是我的推荐信:
配置单元语言手册:日期/时间类型
配置单元语言手册:日期函数
更新:关于人类可读性
这里我举一个例子 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 |
2条答案
按热度按时间zzwlnbp81#
(我在这里自己提供答案)
不要混淆
timestamp
带有“unix时间戳”timestamp
实际上是人类可读的;虽然“unix timestamp”是自1970年1月1日以来的秒/毫秒数,但它确实不太适合人类阅读。但是,我们可以使用
cast()
转换后者(通过函数)from_unixtime()
)得到前者。结果:
mec1mxoz2#
Timestamp
做你想做的事。我不知道你说的“人类可读”是什么意思。所有数据库都以内部格式存储日期和日期时间,这与显示格式完全无关。近似地说,不同数据库的内部格式是不同的(维基百科有一篇有趣的文章,介绍了不同计算机系统使用的一些不同的“0”日期。)如果要以特定方式查看值,请将结果格式化为字符串。hive有一个完整的字符串函数来处理
timestamp
值,并在需要时轻松地将字符串文字转换为时间戳。