配置单元和sparksql不支持日期时间类型?

hec6srdp  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(412)

是真的吗 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 |

zzwlnbp8

zzwlnbp81#

(我在这里自己提供答案)
不要混淆 timestamp 带有“unix时间戳” 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 |
-------------------------------------------------------------------------------------------
mec1mxoz

mec1mxoz2#

Timestamp 做你想做的事。我不知道你说的“人类可读”是什么意思。所有数据库都以内部格式存储日期和日期时间,这与显示格式完全无关。近似地说,不同数据库的内部格式是不同的(维基百科有一篇有趣的文章,介绍了不同计算机系统使用的一些不同的“0”日期。)
如果要以特定方式查看值,请将结果格式化为字符串。hive有一个完整的字符串函数来处理 timestamp 值,并在需要时轻松地将字符串文字转换为时间戳。

相关问题