Hive支持关系型数据库的绝大多数基本数据类型,同时也支持4种集合数据类型

基本数据类型

Hive类似和java语言中一样,会支持多种不同长度的整型和浮点类型数据,同时也支持布尔类型、字符串类型,时间戳数据类型以及二进制数组数据类型等。具体的如下表:

大类 类型
Integers(整型) TINYINT – 1字节的有符号整数
SMALLINT – 2字节的有符号整数
INT – 4字节的有符号整数
BIGINT – 8字节的有符号整数
Floating point numbers(浮点数) FLOAT – 单精度浮点数
DOUBLE – 双精度浮点数
Fixed point numbers(定点数) DECIMAL – 17字节,任意精度数字。通常用户自定义decimal(12, 6)
String(字符串) STRING – 可指定字符集的不定长字符串
VARCHAR – 1-65535长度的不定长字符串
CHAR – 1-255定长字符串
Datetime(时间日期类型) TIMESTAMP – 时间戳(纳秒精度)
DATE – 时间日期类型
Boolean(布尔类型) BOOLEAN – TRUE / FALSE
Binary types(二进制类型) BINARY – 字节序列

这些类型名称都是 Hive 中保留字。这些基本的数据类型都是 java 中的接口进行实现的,因此与 java 中数据类型是基本一致的,如下:

Hive数据类型 Java数据类型 长度 样例
TINYINT byte 1byte有符号整数 20
SMALLINT short 2byte有符号整数 30
INT int 4byte有符号整数 40
BIGINT long 8byte有符号整数 50
BOOLEAN boolean 布尔类型 TURE / FALSE
FLOAT float 单精度浮点数 3.14159
DOUBLE double 双精度浮点数 3.14159
STRING string 字符系列,可指定字符集;可使用单引号或双引号 ‘The Apache Hive data warehouse software facilitates’
TIMESTAMP 时间类型
BINARY 字节数组

基本数据类型的转换

隐式转换

Hive的数据类型是可以进行隐式转换的,类似于Java的类型转换。

如用户在查询中将一种浮点类型和另一种浮点类型的值做对比,Hive会将类型转换成两个浮点类型中值较大的那个类型,即:将FLOAT类型转换成DOUBLE类型;当然如果需要的话,任意整型会转化成DOUBLE类型。

Hive 中基本数据类型遵循以下层次结构,按照这个层次结构,子类型到祖先类型允许隐式转换。


1
2
3
4
5
6
7
8
9
10
11
hive> select '1.0'+2;
OK
3.0

hive> select '1111' > 10;
OK
TRUE

hive> select 1 > 0.8;
OK
TRUE

显示转换

使用cast函数进行强制类型转换;如果强制类型转换失败,返回NULL

1
2
3
4
5
6
7
hive> select cast('1111s' as int);
OK
NULL

hive> select cast('1111' as int);
OK
1111

集合数据类型

Hive支持集合数据类型,包括array、map、struct、union

类型 描述 字面量示例
ARRAY 有序的相同数据类型的集合 array(1,2)
MAP key-value对。key必须是基本数据类型,value不限 map(‘a’, 1, ‘b’,2)
STRUCT 不同类型字段的集合。类似于C语言的结构体 struct(‘1’,1,1.0),
named_struct(‘col1’, ‘1’, ‘col2’, 1, ‘clo3’, 1.0)
UNION 不同类型的元素存储在同一字段的不同行中 create_union(1, ‘a’, 63)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 查询array
hive> select array(1,2,3);
OK
[1,2,3]

# 使用 [] 访问数组元素
hive> select arr[0] from (select array(1,2,3) arr) tmp;
OK
1

# 查询map
hive> select map('a', 1, 'b', 2, 'c', 3);
OK
{"a":1,"b":2,"c":3}

# 使用 [] 访问map元素
hive> select mymap["a"] from (select map('a', 1, 'b', 2, 'c', 3) as mymap) tmp;
OK
1

# 使用 [] 访问map元素。 key 不存在返回 NULL
hive> select mymap["x"] from (select map('a', 1, 'b', 2, 'c', 3) as mymap) tmp;
NULL

# 查询 struct 简单定义
hive> select struct('username1', 7, 1288.68);
OK
{"col1":"username1","col2":7,"col3":1288.68}

# 给 struct 中的字段命名
hive> select named_struct("name", "username1", "id", 7, "salary", 12880.68);
OK
{"name":"username1","id":7,"salary":12880.68}

# 使用 列名.字段名 访问 struct 中具体信息
hive> select userinfo.id from (select named_struct("name", "username1", "id", 7, "salary", 12880.68) userinfo) tmp;
OK
7

# 查询 union
hive> select create_union(0, "zhansan", 19, 8000.88) uinfo;

文本文件数据格式

Hive表中的数据在存储在文件系统上,Hive定义了默认的存储格式,也支持用户自定义文件存储格式。

Hive默认使用几个很少出现在字段值中的控制字符,来表示替换默认分隔符的字符。

默认分隔符

1
2
3
4
5
6
7
id name age hobby(array) score(map)

666^Alisi^A18^Aread^Bgame^Ajava^C97^Bhadoop^C87

字段之间:^A
元素之间: ^B
key-value之间:^C
分隔符 名称 说明
\n 换行符 用于分隔行。每一行是一条记录,使用换行符分割数据
^A < Ctrl >+A 用于分隔字段。在CREATE TABLE语句中使用八进制编码\001表示
^B < Ctrl >+B 用于分隔 ARRAY、MAP、STRUCT 中的元素。在CREATETABLE语句中使用八进制编码\002表示
^C < Ctrl +C> Map中 key、value之间的分隔符。在CREATE TABLE语句中使用八进制编码\003表示

在加载数据的过程中,Hive 不会对数据本身进行任何修改,而只是将数据内容复制或者移动到相应的 HDFS 目录中。

将 Hive 数据导出到本地时,系统默认的分隔符是^A、^B、^C 这些特殊字符,使用 cat 或者 vim 是看不到的;可以使用cat -A file.dat

在 vi 中输入特殊字符:

(Ctrl + v) + (Ctrl + a) => ^A

(Ctrl + v) + (Ctrl + b) => ^B

(Ctrl + v) + (Ctrl + c) => ^C

读时模式

Hive中数据加载过程采用"读时模式" (schema on read),加载数据时不进行数据格式的校验,读取数据时如果不合法则显示NULL。这种模式的优点是加载数据迅速。

读时模式 -> 读时检查数据 -> Hive;好处:加载数据快;问题:数据显示NULL

在传统数据库中,在加载时发现数据不符合表的定义,则拒绝加载数据。数据在写入数据库时对照表模式进行检查,这种模式称为"写时模式"(schema on write)。

写时模式 -> 写数据检查 -> RDBMS