gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:46:26 33 4
gpt4 key购买 nike

Hive是真的吗和 SparkSQL不支持 datetime 的数据类型?

从我对引用文献的阅读来看,它们似乎只支持 datetimestamp .前者没有时间分量(即小时、分钟和秒);后者具有高精度(低至毫秒),但不是人类可读的(它总是需要通过 from_unixtime()date_format() 进行转换,结果将是一个字符串,而不是 datetime 类型)。

相比之下,其他数据库系统,如MySQL确实有 datetime 的数据类型. (例如,看到这个 ref )

有什么好的建议/技巧来解决这个限制吗?

这些是我的引用:

  • Hive Language Manual: Date/Time Types
  • 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 |
    ------------------------------------------------------

    最佳答案

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

    不要混淆timestamp带有“unix 时间戳”
    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 |
    -------------------------------------------------------------------------------------------

    关于sql - Hive 和 SparkSQL 不支持日期时间类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46863547/

    33 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com