一、基本数据类型
Hive支持的基本数据类型与SQL标准数据类型几乎一致,包括:
1. TINYINT -- 8 bit 有符号整数
2. SMALLINT -- 16 bit 有符号整数
3. INT -- 32 bit 有符号整数
4. BIGINT -- 64 bit 有符号整数
5. BOOLEAN -- 真 / 假
6. FLOAT -- 单精度浮点数
7. DOUBLE -- 双精度浮点数
8. STRING -- 字符串
9. TIMESTAMP -- 时间戳
常见的数据类型 Hive 都支持,只不过 Hive 中的表内容是存储在 HDFS 上的,比较大的数值类型都是可行的,但是字节数较少的数据类型可能不太适用,如 TINYINT 和 UCHAR 。FLOAT 和 DOUBLE 数据类型可以存储相对较大的数据范围,但是在计算时要注意可能存在的数据精度误差。
二、复合数据类型
复合数据类型主要有:
1. 数组类型
Hive中的数组是指通类型的元素数组,数组结构可以嵌套,有两种数组语法:
1. type_name ARRAY
2. ARRAY<type_name>
例如:
CREATE TABLE test_array ( col1 ARRAY<INT> );
INSERT INTO test_array VALUES ( array(1,2,3,4) );
其中 col1 是一个整数类型的数组,数组的元素由小括号中的数字构成。
2. 映射类型
映射类型是指将一个数据类型映射为另一个类型,其中包含键值对。具有以下两种语法形式:
1. MAP<key_type, value_type>
2. key_type MAP<value_type>
例如:
CREATE TABLE test_map (
col1 MAP<STRING, INT>,
col2 STRING MAP<INT> );
其中 col1 是使用字符串作为键名,整数作为内容值的映射表,而 col2 是用整数作为键名,字符串作为键值的映射表。
3. 结构类型
结构类型指的是有一组不同的键,每个键对应有一个分别使用不同的数据类型的值。结构类型使用一个结构体类型来表示,可以在语句中使用逗号分隔符的多个键值对:
CREATE TABLE test_struct (
col1 STRUCT<name:STRING,age:INT>,
col2 STRUCT<year:INT,month:INT,day:INT> );
其中 col1 包括 name 和 age 两个键,col2 包含 year, month 和 day 三个键。
三、日期和时间类型
日期和时间类型指的是形如 “YYYY-MM-DD HH:MM:SS” 的事件或日期字符串。Hive 中支持的日期和时间类型包括:
1. DATE
2. TIMESTAMP
3. INTERVAL
DATE 和 TIMESTAMP 类型在语法上十分相似,但是区别在于 TIMESTAMP 支持更大的时间范围和更高的精度。
INTERVAL 类型表示时间跨度,如“3年2个月零5天”.它只有一个参数,单位可以是 YEAR、MONTH、DAY、HOUR、MINUTE 或 SECOND。
下面是使用日期时间类型的示例:
CREATE TABLE test_time ( col1 DATE, col2 TIMESTAMP );
INSERT INTO test_time VALUES ( '2022-10-01', '2022-10-01 09:30:00' );
四、二进制类型
二进制类型用于表示二进制数据,通常用于存储图片、音频等数据。Hive支持的二进制类型包括:
1. BINARY
2. VARBINARY
3. ARRAY<BYTE>
BINARY 表示固定长度的二进制数据,以字符串形式存储;而 VARBINARY 表示可变长度的二进制数据,以字符串形式存储。ARRAY<BYTE> 表示字节类型的数组。
以下是使用二进制类型的示例:
CREATE TABLE test_binary ( col1 BINARY, col2 VARBINARY, col3 ARRAY<BYTE> );
INSERT INTO test_binary VALUES ( 'Data1', 'Data2', ARRAY(1,2,3) );
五、常见问题解析
1. Hive 支持哪种字符编码?
Hive 支持 UTF-8 字符编码,但是如果需要更改 Hive JRE 的默认编码,可以在 hive-site.xml 文件中配置 java.nio.file.encoding 属性。
2. Hive FLOAT 和 DOUBLE 精度问题
Hive 支持 FLOAT 和 DOUBLE 数据类型,但是在计算过程中会有精度问题。这是因为计算机存储浮点数时,会使用二进制来表示,而浮点数在二进制中不一定能够精确表示。如果需要精确计算,可以使用 HiveBigDecimalUDF.jar 或者使用 DECIMAL 类型。
3. Hive 中数据类型和 Java 数据类型的映射关系
Hive 支持的数据类型和 Java 数据类型的映射关系如下:
TINYINT -- Byte
SMALLINT -- Short
INT -- Integer
BIGINT -- Long
BOOLEAN -- Boolean
FLOAT -- Float
DOUBLE -- Double
STRING -- String
TIMESTAMP -- java.sql.Timestamp
需要注意的是,Hive 中的日期类型 DATE 和 INTERVAL 并没有对应的 Java 数据类型。