您的位置:

Hive支持的数据类型

一、基本数据类型

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 数据类型。