目录

Hive时间类型

概述

因为自己和同事也一直对 Hive 的时间类型“记忆模糊”,所以参考官方文档,特意总结一下。

Date and time types

Hive 里日期和时间类型属于基础类型 Primitive Type。

  • TIMESTAMP — 没有时区信息的日期和时间
  • TIMESTAMP WITH LOCAL TIME ZONE — 具有时区信息的日期和时间
  • DATE— 日期,例如 2019-02-11

Timestamps 一直都是一个很麻烦的概念。

Timestamp (“LocalDateTime” semantics)

Java 用 LocalDateTime 来记录年月日时分秒(不考虑时区)。

比如 “2014-12-12 12:34:56”,不代表任何瞬间,只是数值意义上的时间,无关时区。

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 的值会与时区有关,反之,就不管是在哪个时区,他的值都是保持一致的。

关于导入数据的时候,时间格式的问题,还看到一些资料

里面提到,当对以下数据进行转换的时候,可以出来以下的结果。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 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
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
// 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 还有相当多关于时间的内置函数,这里就不列举了。

警告
本文最后更新于 2017年2月1日,文中内容可能已过时,请谨慎参考。