本内容来自:https://gairuo.com
本内容来自:https://gairuo.com
本文将介绍 Hive 中所支持的数据类型,帮助我们在编写 Hql 时正确把握数据类型,对于不匹配的数据类型进行必要的转换。
基本类型
在一张表中一个列是同一个类型,不同的列是不同的类型,这个和 Excel、关系型数据库相同。支持以下基元类型:
- 整型 Integers
- TINYINT—1 byte integer(1 个字节的整形型)
- SMALLINT—2 byte integer(2 个字节的整形型)
- INT—4 byte integer(4 个字节的整形型)
- BIGINT—8 byte integer(8 个字节的整形型)
- 布尔型 Boolean type
- BOOLEAN—TRUE/FALSE(只有真/假两个种取值)
- 浮点数字 Floating point numbers
- FLOAT—single precision(单精度)
- DOUBLE—Double precision(双精度)
- 定点数 Fixed point numbers
- DECIMAL — 用户定义的比例和精度的固定点值
- 字符型 String types
- STRING — 指定字符集中的字符序列
- VARCHAR — 指定字符集中具有最大长度的字符序列
- CHAR — 指定字符集中具有最大长度的字符序列
- 日期时间类型 Date and time types
- TIMESTAMP — 没有时区的日期和时间 ("LocalDateTime" 语意)
- TIMESTAMP WITH LOCAL TIME ZONE — 精度到纳秒的时间点 ("Instant" 语意)
- DATE — 一个日期
- 二进制类型 Binary types
解释:
- 单精度浮点数bai占用4个字节du(32位)存储空间来存储一个浮点数,包括符号位1位,阶码8位,尾数23位。而双精度浮点数使用 8个字节(64位)存储空间来存储一个浮点数,包括符号位1位,阶码11位,尾数52位。因此,它们的数值范围不同。
- DECIMAL 可以理解为可以定义几位小数的数字。
层次结构
这些类型按以下层次结构组织(其中父实例是所有子实例的超级类型):
- Number
- BOOLEAN(与 Number 对齐)
从子类型到祖先类型允许隐式转换,此类型层次结构定义了如何在查询语言中隐式转换类型。因此,当查询表达式需要 type1 并且数据是 type2 时,如果 type1 是类型层次结构中 type2 的祖先,那么 type2 将隐式转换为 type1 。
请注意,类型层次结构允许将字符串隐式转换为 DOUBLE。显式类型转换可以使用 cast 运算符完成。
复合类型
可以使用以下方法从基本类型和其他复合类型构建复杂类型:
- 结构体 Structs:可以使用点(. , the DOT)符号访问类型中的元素。例如,列 c 的类型是一个 STRUCT,形式如 {a INT; b INT},其中一个字段 a 查由表达式 c.a 来访问;
- 图映射 Maps (key-value tuples):用键-值对组成的元组表示,其中的元素用 ['element name'] 标号来访问。例如,一个图映射 M 为 'group' -> gid 形式, gid 值可以用 M['group'] 来访问;
- 数组 Arrays (indexable lists):它是一个可索引的列表,数组中的元素必须是同一类型。可以使用 [n] 表示法访问元素,其中 n 是数组中的索引(从0开始)。例如,对于具 ['a', 'b', 'c'],A[1] 返回 'b'。
使用基本类型和用于创建复杂类型的构造,可以创建具有任意嵌套级别的类型。例如,定义一个 User 类型,包括以下字段:
- gender — 它是一个 STRING.
- active — 它是一个 BOOLEAN.
时间戳
时间戳一直是许多混乱的根源,因此我们试图记录 Hive 的预期语义。
Timestamp ("LocalDateTime" 语意)
Java 的 "LocalDateTime" 有时间将日期和时间记录为年、月、日、时、分和秒,它不带时区。无论本地时区如何,这些时间戳总是具有相同的值。
例如,“2021-03-01 12:34:56”的时间戳值被分解为年、月、日、时、分、秒字段,但没有可用的时区信息。它不对应于任何特定的瞬间。无论本地时区如何,它都将始终是相同的值。除非您的应用程序一致地使用 UTC,否则对于大多数应用程序,带本地时区的时间戳比时间戳更受欢迎。当用户说一个事件发生在 10:00 时,它总是指某个时区,表示某个时间点,而不是任意时区的 10:00。
Timestamp 本地时区 ("Instant" 语意)
Java 的 “Instant” 时间戳定义了一个时间点,不管数据从何处读取该时间点保持不变。因此,时间戳将由本地时区调整以匹配原始时间点。
举例
类型 |
洛杉矶 |
纽约 |
timestamp |
2014-12-12 12:34:56 |
2014-12-12 12:34:56 |
timestamp with local time zone |
2014-12-12 12:34:56 |
2014-12-12 15:34:56 |
参考
- https://cwiki.apache.org/confluence/display/Hive/Tutorial#Tutorial-TypeSystem
- https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types
更新时间:2021-02-27 22:10:31
标签:hive
hql
数据类型