zftang
作者zftang·2020-04-16 14:04
其它·小白一枚

HIVE数据类型

字数 5557阅读 1104评论 0赞 0

1. 基础数据类型

2.1 数值型

类型描述
TINYINT1个字节(8位)有符号整数,from -128 to 127
SMALLINT2个字节(16位)有符号整数,from -32,768 to 32,767
INT4个字节(32位)有符号整数, from -2,147,483,648 to 2,147,483,647
BIGINT8个字节(64位)有符号整数, from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
FLOAT4个字节(32位)单精度浮点数
DOUBLE8个字节(64位)双精度浮点数
DECIMALDECIMAL(precision, scale),Hive-0.11.0版本中引入,Hive-0.13.0版本中做了改进
NUMERIC和DECIMAL一样,从 Hive 3.0.0开始提供支持

Hive 是由 Java 编写的,所以 Hive 的基本数据类型都是对应 Java 中的接口

的实现,这些基本的数据类型和 Java 的基本数据类型是一一对应的。

2.1.1 整数型

整数类型: TINYINT , SMALLINT , INT/INTEGER , BIGINT 默认情况下,整型型被认为是 INT 型的,当数字超过了 INT 的范围,在这种情况下,它被自动解释执行为 BIGINT ,或者使用以下后缀进行说明。

类型后缀例子
TINYINTY100Y
SMALLINTS100S
BIGINTL100L

2.1.2 DECIMAL

Hive 中的 DECIMAL 类型是基于 Java 的 BigDecimal ,它用于表示 Java 中不可

变的任意精度十进制数。

所有常规的数字操作 ( 例如 :+ 、 - 、 * 、 /) 和相关的 UDF( 例如 :Floor 、 Ceil 、 Round

和更多 ) 都使用和支持 Decimal 。

可以将 DECIMAL 和其他数值类型相互转换。 DECIMAL 支持科学和非科学符号表

示。因此,无论数据集是否包含像 4.004E+3( 科学符号 ) 或 4004( 非科学符号 ) 或

两者都有,都可以使用 DECIMAL 类型。

在 Hive0.13 中,用户可以使用语法 DECIMAL(precision, scale) 来指定小数

的位数和精度来创建具有 DECIMAL 数据类型的表。

如果没有指定小数的位数,则默认为 0( 没有小数位数 ) 。如果没有指定精

度,则默认为 10 。

DECIMAL 类型为浮点数提供了比 Double 更加精确的值和更大的范围。

DECIMAL 数据类型存储数字值的精确表示,而双数据类型只是存储非常接近数值的近似。 DECIMAL 类型被使用在一些 DOUBLE 类型的近似值精度不够的环境

中,例如金融应用程序,等于和不等校验和舍入操作,需要使用 DECIMAL 类型。它们可以处理 DOUBLE 范围之外的数字 ( 大约 -10308 到 10308) 或非常接近于

零 (-10-308 到 10-308) 。

2.1.2.1 表结构

2.1.2.2 测试数据

2.1.2.3 查询结果

2.2 日期型

类型描述
TIMESTAMP只是从Hive 0.8.0开始提供支持
DATE只是从Hive 1.2.0开始提供支持
INTERVAL只是从Hive 1.2.0开始提供支持

2.2.1 TIMESTAMP

支持传统的 UNIX 时间戳和可选的纳秒精度。 Hive 中的 timestamp 与时区无关,

存储为 UNIX 纪元的偏移量。

支持的类型转换为:

● 整型数字类型 : 以秒为单位解释为 UNIX 时间戳。

● 浮点数值类型 : 以秒为单位,以十进制精度解释为 UNIX 时间戳。

● 字符串 :JDBC 兼容 java.sql.Timestamp 格式 "YYYY-MM-DD

HH:MM:SS.fffffffff" (9 位小数精度 ) 。

Hive 提供了用于 timestamp 和时区相互转换的便利 UDF : to_utc_timestamp 和 from_utc_timestamp 。

Timestamp 类型可以使用所有的日期时间 UDF ,如 month 、 day 、 year 等。

文本文件中的 Timestamp 必须使用 yyyy-mm-dd hh:mm:ss[.f...] 的格式,如

果使用其它格式,将它们声明为合适的类型( INT 、 FLOAT 、 STRING 等)并使用 UDF

将它们转换为 Timestamp 。

2.2.1.1 表结构

2.2.1.2 查询结果

2.2.2 DATE

Hive 中 DATE 类型的值描述了特定的年月日,以 YYYY--MM--DD 格式表示,例

如 2019-03-26 。 DATE 类型不包含时间,所表示日期的范围为

0000--01--01to9999--12--31 。这取决于 Java Date 类型的原始支持。

Date types 只能在 Date, Timestamp, String types 之间转换。

转换类型结果
cast(date as date)相同的日期值
cast(timestamp as date)时间戳的年/月/日是根据本地时区确定的,并作为日期值返回。
cast(string as date)如果字符串是“YYYY-MM-DD”,则返回对应于该年/月/日的日期值。 如果字符串值不匹配此formate,则返回NULL。
cast(date as timestamp)时间戳值对应于日期值的年/月/日的午夜,基于本地时区。
cast(date as string)以日期为代表的年/月/日格式为“YYYY-MM-DD”格式的字符串。

2.2.2.1 查询结果

2.2.3 INTERVAL

时间间隔在 1.2.0 之后版本支持,在 2.2.0 版本上进行了扩展。

支持的区间描述样例含义
间隔的时间单位: SECOND / MINUTE / DAY / MONTH / YEARINTERVAL '1' DAYan interval of 1 day(s) 间隔1天
年到月的时间区间格式:SY-M S: 可选参数 (+/-) Y: 年数 M: 月数INTERVAL '1-2' YEAR TO MONTHshorthand for: INTERVAL '1' YEAR + INTERVAL '2' MONTH 间隔1年2个月
天到秒的时间区间格式: SD H:M:S.nnnnnn S: 可选参数 (+/-) D: 天数 H: 小时数 M: 分钟数 S: 秒数 nnnnnn: 可选的纳秒INTERVAL '1 2:3:4.000005' DAYshorthand for: INTERVAL '1' DAY+ INTERVAL '2' HOUR + INTERVAL '3' MINUTE + INTERVAL '4' SECOND + INTERVAL '5' NANO 间隔1天2小时3分4秒5纳秒
支持常量级间隔INTERVAL 1 DAYaids query readability/portability
支持间隔表达式: 这可能涉及其他函数/列。 表达式必须返回一个数字(不可以是浮点数)或字符串。INTERVAL (1+dt) DAYenables dynamic intervals 支持动态间隔
可选的使用区间关键字 间隔关键字的用法是强制性的。 间隔的表达式(ex: INTERVAL (1+dt) SECOND)1 DAY '1-2' YEAR TO MONTHINTERVAL 1 DAY INTERVAL '1-2' YEARS TO MONTH
添加timeunit别名以帮助可移植性/可读性。: SECONDS / MINUTES / HOURS / DAYS / WEEKS / MONTHS / YEARS2 SECONDS2 SECOND

2.3 字符型

Hive 中目前有三种字符串类型: STRING, VARCHAR, CHAR 。

2.3.1 STRING

字符串可以用单引号 (') 或双引号 (') 表示。 Hive 使用 c 样式在字符串中转

义。

2.3.2 VARCHAR

Hive-0.12.0 版本引入了 VARCHAR 类型, VARCHAR 类型使用长度指示器( 1 到

65355 )创建,长度指示器定义了在字符串中允许的最大字符数量。

如果要转换 / 分配给 varchar 值的字符串值超过 length 说明符,那么字符串

将自动被截断。字符长度由字符串包含的代码点的数量确定。像字符串一样,尾

部空格在 varchar 中很重要,并且会影响比较结果。

非通用 UDFs 不能直接使用 varchar 类型作为输入参数或返回值。可以创建

字符串 UDFs ,而 varchar 值将被转换为 strings 并传递到 UDF 。要直接使用

varchar 参数或返回 varchar 值,请创建 GenericUDF 。

如果基于 reflection-based 方法来获取数据类型信息,则可能存在不支持

varchar 的场景。 这包括一些 SerDe 函数实现。

2.3.3 CHAR

Char 类型与 Varchar 类似,但它们是固定长度的,这意味着比指定长度值短的部分是用空格填充的,因此在比较时,尾随空格并不重要。最大长度固定在

255 。

2.4 其他

2.4.1 BOOLEAN

boolean 类型,值为 true 与 false 两种类型。

2.4.2 BINARY

二进制类型,从 Hive0.8.0 开始提供支持。

2. 复杂数据类型

Hive 与传统的关系型数据库并不相同, Hive 支持以 Java , C 为原型的一些

复杂数据结构。如: Array , Map , Struct , Union 。

3.1 ARRAY

ARRAY 类型是由一系列相同数据类型的元素组成,如: ARRAY 。

数组元素可以通过下标来访问,比如有一个 ARRAY 类型的变量 fruits ,它

是由 ['apple','orange','mango'] 组成,那么我们可以通过 fruits[1] 来访问

元素 orange ,因为 ARRAY 类型的下标是从 0 开始的。

从 Hive0.14 起数组允许负值和非常量表达式。

Data_type:primitive_type,array_type,map_type,struct_type,union_type

Primitive_type: TINYINT,SMALLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,

STRING,BINARY,TIMESTAMP,DECIMAL,DATE,VARCHAR,CHAR

3.2 MAP

MAP 类型是一组无序的 键值对,如:

MAP 。键的类型必须是原子的,值可以是任何类型,

同一个映射的键的类型必须相同,值得类型也必须相同。

MAP 可以通过 key 来访问元素 , 比如” userlist ”是一个 map 类型,其中

username 是 key , password 是 value ;那么我们可以通过 userlist['username']

来得到这个用户对应的 password 。

从 Hive0.14 起 MAP 允许负值和非常量表达式。

3.3 STRUCT

STRUCT 类型是一组命名的字段,如:

STRUCT 。字段类型可以包

含不同数据类型的元素。

这些元素可以通过”点语法”的方式来得到所需要的元素,比如 user 是一

个 STRUCT 类型, user ,那么可以通过

user.address 得到这个用户的地址。

3.4 UNION

UNION 类型包含不同的数据类型,如:

UNIONTYPE 。

在 Hive0.7.0 中引入了 UNIONTYPE 数据类型,但是在 Hive 中对这种类型的

支持仍然不完全。

在包含 UNION TYPE 字段的 JOIN , WHERE , GROUP BY 查询中子句将会失败,

而 Hive 没有定义语法来提取 UNIONTYPE 字段的标记或值。

这就意味着 UNIONTYPE 实际上是在实验观察阶段。

3. 读时模式

4.1 模式介绍

当用户向传统数据库中加载数据的时候,数据库对于存储具有完全的控制能

力,数据库就是 " 守门人 " 。

传统数据库是写入模式,即数据在写入数据库时对模式进行检查。

Hive 对于存储没有这样的控制, Hive 不会在数据加载的时候进行验证,而

是在查询的时候进行,也就是读时模式。

如果记录中的字段个数或者字段类型不匹配的话,那么用户会在查询结果中

看到多个 null 值。

4.2 举例

4.2.1 建表语句

Create table IF NOT EXISTS users (

XM string,

NL int,

XH ARRAY ,

CJ MAP ,

ZZ STRUCT ,

SR date,

SFSC BOOLEAN,

SJ TIMESTAMP

)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY ','

COLLECTION ITEMS TERMINATED BY '_'

MAP KEYS TERMINATED BY ':'

LINES TERMINATED BY '\n';

4.2.2 插入数据

4.2.3 查询结果

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关问题

相关资料

X社区推广