Hive和SparkSQL不支持datetime类型?

时间:2017-10-21 13:08:08

标签: sql hive apache-spark-sql

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

从我对参考文献的阅读中,它们似乎只支持datetimestamp。前者不是时间成分(即小时,分钟和秒);后者具有高精度(低至毫秒)但不是非常易读(它总是需要from_unixtime()date_format()的转换,结果将是一个字符串,而不是datetime类型)。

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

如何解决此限制的任何好建议/提示?

这些是我的参考资料:

  1. Hive Language Manual: Date/Time Types
  2. Hive Language Manual: Date Functions
  3. 更新:人类可读性

    这里我举一个关于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的表示是 人类可读,但它失去了datetimedatatime的属性 将需要进一步转换回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
    

2 个答案:

答案 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 |
-------------------------------------------------------------------------------------------