Hive 的数据类型
基本类型
整型
- TINYINT: 1字节整数,范围从 -128 到 127。
- SMALLINT: 2字节整数,范围从 -32,768 到 32,767。
- INT: 4字节整数,范围从 -2,147,483,648 到 2,147,483,647。
- BIGINT: 8字节整数,范围从 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。
布尔型
- BOOLEAN: 真(TRUE)或假(FALSE)。
浮点型
- FLOAT: 单精度浮点数,通常用于不需要高精度的情况。
- DOUBLE: 双精度浮点数,提供更高的精度。
定点数
- DECIMAL: 用户定义的精度和小数位数,适合金融计算等需要精确数值的场景。
字符型
- STRING: 可变长度的字符串。
- VARCHAR: 可变长度的字符串,需要指定最大长度。
- CHAR: 固定长度的字符串,需要指定长度。
日期时间型
- TIMESTAMP: 包含日期和时间,但不包含时区信息。
- TIMESTAMP WITH LOCAL TIME ZONE: 包含日期、时间和时区信息。
- DATE: 只包含日期部分。
二进制型
- BINARY: 字节序列,适合存储二进制数据。
复合类型
结构体(Structs)
- 结构体是由多个字段组成的数据类型,每个字段有自己的名称和类型。可以通过字段名访问结构体中的值。
映射(Maps)
- 映射是一组键值对,键必须是唯一的。可以通过键访问映射中的值。
数组(Arrays)
- 数组是一系列相同类型的元素集合。可以通过索引访问数组中的元素。
类型层次结构
Hive 的类型系统遵循一定的层次结构,允许某些类型之间的隐式转换:
- Number 类型之间可以隐式转换(如
TINYINT
转换为INT
)。 - STRING 可以隐式转换为
DOUBLE
。 - BOOLEAN 可以隐式转换为
Number
。
时间戳注意事项
- TIMESTAMP 不包含时区信息,适用于不需要考虑时区的场景。
- TIMESTAMP WITH LOCAL TIME ZONE 包含时区信息,适用于需要精确时区的场景。、
假设我们有一个用户表 users
,其结构如下:
CREATE TABLE users (
id BIGINT,
name STRING,
gender CHAR(1),
active BOOLEAN,
created_at TIMESTAMP,
attributes MAP<STRING, STRING>,
address STRUCT<street: STRING, city: STRING, zip: STRING>
);
在这个表中:
id
是一个 8 字节的整数。name
是一个可变长度的字符串。gender
是一个固定长度为 1 的字符串。active
是一个布尔值。created_at
是一个时间戳。attributes
是一个映射,键和值都是字符串。address
是一个结构体,包含街道、城市和邮政编码。
下面是如何向 users
表中插入数据:
插入单行/多行数据
INSERT INTO users (id, name, gender, active, created_at, attributes, address)
VALUES (
1,
'John Doe',
'M',
TRUE,
'2023-10-01 12:34:56',
MAP('age', '30', 'email', 'john.doe@example.com'),
NAMED_STRUCT('street', '123 Main St', 'city', 'Anytown', 'zip', '12345')
);
INSERT INTO users (id, name, gender, active, created_at, attributes, address)
VALUES
(1, 'John Doe', 'M', TRUE, '2023-10-01 12:34:56', MAP('age', '30', 'email', 'john.doe@example.com'), NAMED_STRUCT('street', '123 Main St', 'city', 'Anytown', 'zip', '12345')),
(2, 'Jane Smith', 'F', FALSE, '2023-10-02 13:45:00', MAP('age', '28', 'email', 'jane.smith@example.com'), NAMED_STRUCT('street', '456 Elm St', 'city', 'Othertown', 'zip', '67890'));
注意事项
- 时间戳格式:确保时间戳的格式正确,通常为
'YYYY-MM-DD HH:MM:SS'
。 - MAP 和 STRUCT:使用
MAP
和NAMED_STRUCT
函数来创建映射和结构体。 - 布尔值:布尔值使用
TRUE
或FALSE
。