提示
Hive SQL 教程 编写中,使用过程中有任何建议,提供意见、建议、纠错、催更加微信 sinbam。
本文将介绍 Hive 中所支持的数据类型,帮助我们在编写 Hql 时正确把握数据类型,对于不匹配的数据类型进行必要的转换。
基本类型
在一张表中一个列是同一个类型,不同的列是不同的类型,这个和 Excel、关系型数据库相同。支持以下基元类型:
整型 IntegersTINYINT—1 byte integer(1 个字节的整形型)
SMALLINT—2 byte integer(2 个字节的整形型)
INT—4 byte integer(4 个字节的整形型)
BIGINT—8 byte integer(8 个字节的整形型)
布尔型 Boolean typeBOOLEAN—TRUE/FALSE(只有真/假两个种取值)
浮点数字 Floating point numbersFLOAT—single precision(单精度)
DOUBLE—Double precision(双精度)
定点数 Fixed point numbersDECIMAL — 用户定义的比例和精度的固定点值
字符型 String typesSTRING — 指定字符集中的字符序列
VARCHAR — 指定字符集中具有最大长度的字符序列
CHAR — 指定字符集中具有最大长度的字符序列
日期时间类型 Date and time typesTIMESTAMP — 没有时区的日期和时间 ("LocalDateTime" 语意)
TIMESTAMP WITH LOCAL TIME ZONE — 精度到纳秒的时间点 ("Instant" 语意)
DATE — 一个日期
二进制类型 Binary typesBINARY — 字节序列
解释:
单精度浮点数bai占用4个字节du(32位)存储空间来存储一个浮点数,包括符号位1位,阶码8位,尾数23位。而双精度浮点数使用 8个字节(64位)存储空间来存储一个浮点数,包括符号位1位,阶码11位,尾数52位。因此,它们的数值范围不同。
DECIMAL 可以理解为可以定义几位小数的数字。
层次结构
这些类型按以下层次结构组织(其中父实例是所有子实例的超级类型):
NumberDOUBLEFLOATBIGINTINTSMALLINTTINYINT
STRING(与 FLOAT 对齐)
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