2017-10-21 45 views
0

是不是HiveSparkSQL不支持datetime的数据类型?Hive和SparkSQL不支持日期时间类型?

从我阅读的参考文献中,他们似乎只支持datetimestamp。前者不是时间分量(即小时,分钟和秒);后者具有很高的精确度(低至毫秒),但并不是人类可读的(它总是需要通过from_unixtime()date_format()进行转换,结果将是字符串,而不是datetime类型)。

相比之下,其他数据库系统(如MySQL)具有的数据类型为datetime。 (例如见ref

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

这是我的引用:

  1. Hive Language Manual: Date/Time Types
  2. Hive Language Manual: Date Functions

更新:在人类可读性

这里,我给上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 | 
------------------------------------------------------ 

回答

0

(我提供自己的答案在这里)

不要用 “UNIX时间戳”

timestamp实际上是人类可读的混淆timestamp;而“unix timestamp”,即自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 | 
------------------------------------------------------------------------------------------- 
2

Timestamp做你想做的。我不确定你的意思是“人类可读的”。所有数据库都以内部格式存储日期和日期时间,这与显示格式根本不相关。并且 - 近似地说 - 不同的数据库的内部格式是不同的。 (对于不同计算机系统使用的某些不同“0”日期,维基百科有一个乐趣article)。

如果您想以特定方式查看该值,然后将结果格式化为字符串。 Hive具有完整的字符串函数以处理timestamp值,并且在需要时它可以轻松地将字符串文字转换为时间戳。

+0

感谢您的回答!我更新了我的问题,以澄清我的意思是“人的可读性”。请检查并发表评论。 – leeyuiwah

+0

其实我的问题可能与另一个问题有关。如果可以的话,请看看我的另一个问题:https://stackoverflow.com/questions/46869005/hive-sparksql-how-to-convert-a-unix-timestamp-into-a-timestamp-not-字符串非常感谢! – leeyuiwah

+0

@leeyuiwah。 。 。对于字符串和内部格式之间的转换,Hive确实倾向于非常灵活。 –

相关问题