![0d5518cd6bebde45897ae16771a9ac81.png](https://i-blog.csdnimg.cn/blog_migrate/600269ac75c20c602deb868d6a8266b2.jpeg)
1 Overview
因为自己和同事也一直对 Hive 的时间类型“记忆模糊”,所以参考官方文档,特意总结一下。
2 Date and time types
Hive 里日期和时间类型属于基础类型 Primitive Type。
- TIMESTAMP — 没有时区信息的日期和时间
- TIMESTAMP WITH LOCAL TIME ZONE — 具有时区信息的日期和时间
- DATE— 日期,例如 2019-02-11
Timestamps 一直都是一个很麻烦的概念。
2.1 Timestamp ("LocalDateTime" semantics)
Java 用 LocalDateTime 来记录年月日时分秒(不考虑时区)。
比如 "2014-12-12 12:34:56",不代表任何瞬间,只是数值意义上的时间,无关时区。
2.2 Timestamp with local time zone ("Instant" semantics)
Java 的瞬时 timestamps 定义来一个时间,而不管这个数据是在什么地方被读取的。因此,timestamp 会根据不同的时区来进行匹配。
|Type|Los_Angeles|New_York| |:---|:---|:---| |timestamp with local time zone|2014-12-12 12:34:56|2014-12-12 15:34:56| |timestamp|2014-12-12 12:34:56|2014-12-12 12:34:56|
从上面表格可以知道,如果是需要考虑时区的,那么该 timestamp 的值会与时区有关,反之,就不管是在哪个时区,他的值都是保持一致的。
关于导入数据的时候,时间格式的问题,还看到一些资料。
https:// community.hortonworks.com /questions/25325/hive-datatype-timestamp-with-miliseconds.html
里面提到,当对以下数据进行转换的时候,可以出来以下的结果。
// data file
2015-11-01 21:10:00.1
2015-11-01 21:10:00.1190011
2015-11-01 21:10:00.12
2015-11-01 21:10:00.123
2015-11-01 21:10:00.1234
2015-11-01 21:10:00.12345
2015-11-01 21:10:00.123456789
2015-11-01 21:10:00.490155
2015-11-01 21:10:00.1234567890
2015-11-01 21:10:00.1234567890123456789
// select * from test_timestamp;
+--------------------------------+--+
| test_timestamp.col |
+--------------------------------+--+
| 2015-11-01 21:10:00.1 |
| 2015-11-01 21:10:00.1190011 |
| 2015-11-01 21:10:00.12 |
| 2015-11-01 21:10:00.123 |
| 2015-11-01 21:10:00.1234 |
| 2015-11-01 21:10:00.12345 |
| 2015-11-01 21:10:00.123456789 |
| 2015-11-01 21:10:00.490155 |
| NULL |
| NULL |
结果说明了,Hive 支持到纳秒。如果溢出,则转换为了 NULL。
附上一些关于时间的内置函数。
|返回类型|函数名|描述| |:---|:---|:---| |string|from_unixtime(int unixtime)|输入表示 UNIX 的时间戳,返回代表该日期的当前系统时区的字符串日期| |string|to_date(string timestamp)|to_date("1970-01-01 00:00:00") = "1970-01-01"| |int|year(string date)|year("1970-01-01 00:00:00") = 1970|
Hive 还有相当多关于时间的内置函数,这里就不列举了。