Hive 中,可以用String、Date和Timestamp表示日期时间,String 用 yyyy-MM-dd 的形式表示,Date 用 yyyy-MM-dd 的形式表示,Timestamp 用 yyyy-MM-dd hh:mm:ss 的形式表示。这三种数据类型在使用细节上,有一些需要注意的点:
- 在用命令行插入值的时候,需要进行类型转换,把String类型的字符串转化成相应的时间类型。转化的规则如下:
类型转化 | 结果(参照下图) |
---|---|
cast(string as date) | 如果字符串的格式为'YYYY-MM-DD', 则对应的年月日返回。如果字符串不是该格式,则返回NULL。 |
cast(date as string) | 日期被转换为'YYYY-MM-DD'格式的字符串。 |
cast(timestamp as date) | 基于本地时区确定timestamp的年月日作为值返回。 |
cast(date as timestamp) | 基于本地时区,返回日期对应午夜时间。 |
- 在做时间比较的时候(如join条件为不同时间类型的两个字段),不同类型的比较结果如下图所示。
Join比较
在两表Join时,会涉及到字段的比较,此时应注意:
- 如第一张图所示,如果时间信息中不包含时分秒,String 与 Date、Timestamp 表达的时间相同时是可以直接比较的,但是Date和Timestamp之间却不能直接比较的。
如果想比较这两种时间类型,需要用cast函数做转换,如:a_table join b_table on (a_table.timestamp_column = cast(b_table.date_column as timestamp));
- 如第二张图所示,如果时间信息中包含时分秒,此时String 与 Timestamp 表达的时间相同时是可以直接比较的,Date 不能表示带时分秒的信息。
Insert value
在insert value时,使用者一般用字符串的形式向Hive表中插入value,但是字符串的插入的结果与字段类型相关。如上图所示,图中绿线表示插入成功,红线表示插入失败得到了不想要的结果。