hive 数据类型 java_Hive SQL 中 Hive 的数据类型

提示

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值