首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hive和SparkSQL不支持日期时间类型?

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

Stack Overflow用户
提问于 2017-10-21 13:08:08
回答 2查看 11K关注 0票数 7

HiveSparkSQL不支持datetime的数据类型是真的吗?

从我对参考资料的阅读来看,它们似乎只支持datetimestamp。前者不是时间组件(即小时、分钟和秒);后者具有很高的精度(下到毫秒),但并不是很容易读懂(它总是需要from_unixtime()date_format()的转换,结果将是一个字符串,而不是datetime类型)。

相反,其他数据库系统(如MySQL )确实具有datetime的数据类型。(例如见本参考)

有什么好的建议/建议如何解决这一限制?

以下是我的参考资料:

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

更新:关于人类可读性

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

代码语言:javascript
复制
-- 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,它是人类可读的)

代码语言:javascript
复制
+------------+---------------------+-----------------+---------------------+
| 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中。

代码语言:javascript
复制
-- Hive/SparkSQL  code
select 
  current_date                    asDate,
  unix_timestamp()                asUnixTimestamp,
  from_unixtime(unix_timestamp(), 
    'yyyy-MM-dd HH:mm:ss')        asString

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

代码语言:javascript
复制
------------------------------------------------------
| asDate     | asUnixTimestamp | asString            |
| ---------- | --------------- | ------------------- |
| 2017-10-21 | 1508625586      | 2017-10-21 22:39:46 |
------------------------------------------------------
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-22 15:53:48

(我在这里提供答案)

timestamp 不将与“unix时间戳”混淆。

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

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

代码语言:javascript
复制
-- 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

结果:

代码语言:javascript
复制
-------------------------------------------------------------------------------------------
| 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 |
-------------------------------------------------------------------------------------------
票数 7
EN

Stack Overflow用户

发布于 2017-10-21 13:15:47

Timestamp做你想做的事。我不知道你说的“人类可读性”是什么意思。所有数据库都以内部格式存储日期和日期时间,这与显示格式完全无关。而且--近似地说--不同数据库的内部格式是不同的。(维基百科在不同计算机系统使用的不同"0“日期上有一个有趣的文章。)

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46863547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档