文章目录
在前面的教程,已经初步了解了Hive
的数据模型,有兴趣的同学可以参阅:
上一节写了hive
数据模型,其实就是告诉我们使用hive
可以把数据存放到hdfs
的哪几种目录(表、分区、桶)。
既然知道了存储的目的地,那么我们总得知道要存的数据有什么特性,就是本文要将的hive
数据类型。
2.1 基础类型
HQL
的基本类型和 Java
的基本类型很接近,分类如下:
类型 | 描述 | 示例 |
---|---|---|
BOOLEN | true/false | TRUE |
TINYINT | 1字节的有符号整数,范围:-128~127 | 1Y |
SMALLINT | 2字节的有符号整数,范围:-32768~32767 | 1S |
INT | 4字节的带符号整数 | 1 |
BIGINT | 8字节带符号整数 | 1L |
FLOAT | 4字节单精度浮点数1.0 | |
DOUBLE | 8字节单精度浮点数 | 1 |
DEICIMAL | 任意精度的带符号小数 | 1 |
STRING | 字符串,变长 | “a” |
VARCHAR | 变长字符串 | “a” |
CHAR | 固定长度字符串 | “a” |
BINARY | 字节数组 | |
TIMESTAMP | 时间戳,纳秒精读 | 1.22327E+11 |
DATE | 日期 | ‘2022-02-21’ |
2.1.1 整型
在使用整数字面量时,默认情况下为 INT
,如果要声明为其他类型,通过后缀来标识。
2.1.2 浮点型
2.1.3 文本型
STRING
存储变长的文本,对长度没有限制,理论上为2GB。
2.1.4 布尔及二进制
-
BOOLEAN:表示二元的
true
或false
; - BINARY:用于存储变长的二进制数据。
2.1.5 时间类型
TIMESTAMP
存储纳秒级别的时间戳,同时Hive
提供了一些内置函数用于在 TIMESTAMP
与Unix
时间戳(秒)和字符串之间做转换,如下:
cast(date as date)
cast(timestamp as date)
cast(string as date)
cast(date as string)
2.2 复杂类型
类型 | 描述 | 示例 |
---|---|---|
ARRAY | 有序的同类型集合 | array(1,2) |
MAP | key-value,key必须为原始类型,value可以为任意类型 | map(‘a’,‘1’,‘b’) |
STRUCT | 字段集合,类型可以不同 | struct(‘a’,1,1.0),name_stract(‘col1’,‘1’,‘col2’,1.0) |
UNION | 在有限值范围内的一个值 | create_union(1,‘a’,63) |
2.2.1 STRUCT
文件里的数据分隔符要和建表指定的一致,举例:
① 创建表:
CREATE TABLE IF NOT EXISTS person_1 (id int,info struct<name:string,country:string>)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY ':'
STORED AS TEXTFILE;
② 创建一个文本文件test_struct.txt
:
1,'dd':'jp'
2,'ee':'cn'
3,'gg':'jp'
4,'ff':'cn'
5,'tt':'jp'
③ 导入数据:
LOAD DATA LOCAL INPATH '/data/test_struct.txt' OVERWRITE INTO TABLE person_1;
④ 查询数据:
hive> select * from person_1;
OK
1 {"name":"'dd'","country":"'jp'"}
2 {"name":"'ee'","country":"'cn'"}
3 {"name":"'gg'","country":"'jp'"}
4 {"name":"'ff'","country":"'cn'"}
5 {"name":"'tt'","country":"'jp'"}
Time taken: 0.046 seconds, Fetched: 5 row(s)
hive> select id,info.name,info.country from person_1 where info.name='dd';
OK
1 dd jp
Time taken: 1.166 seconds, Fetched: 1 row(s)
2.2.2 ARRAY
ARRAY 表示一组相同数据类型的集合,下标从零开始,可以用下标访问:
CREATE TABLE IF NOT EXISTS array_1 (id int,name array<STRING>)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY ':'
STORED AS TEXTFILE;
//导入数据
LOAD DATA LOCAL INPATH '/data/test_array.txt' OVERWRITE INTO TABLE array_1;
//查询数据
hive> select * from array_1;
OK
1 ["dd","jp"]
2 ["ee","cn"]
3 ["gg","jp"]
4 ["ff","cn"]
5 ["tt","jp"]
Time taken: 0.041 seconds, Fetched: 5 row(s)
hive> select id,name[0],name[1] from array_1 where name[1]='cn';
OK
2 ee cn
4 ff cn
Time taken: 1.124 seconds, Fetched: 2 row(s)
2.2.3 MAP
MAP
是一组键值对的组合,可以通过KEY
访问 VALUE
,键值之间同样要在创建表时指定分隔符:
CREATE TABLE IF NOT EXISTS map_1 (id int,name map<STRING,STRING>)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY ':'
MAP KEYS TERMINATED BY ':'
STORED AS TEXTFILE;
//加载数据
LOAD DATA LOCAL INPATH '/data/test_map.txt' OVERWRITE INTO TABLE map_1;
//查询数据
hive> select * from map_1;
OK
1 {"name":"dd","country":"jp"}
2 {"name":"ee","country":"cn"}
3 {"name":"gg","country":"jp"}
4 {"name":"ff","country":"cn"}
5 {"name":"tt","country":"jp"}
Time taken: 0.038 seconds, Fetched: 5 row(s)
select id,info['name'],info['country'] from map_1 where info['country']='cn';
OK
2 ee cn
4 ff cn
Time taken: 1.088 seconds, Fetched: 2 row(s)
2.2.4 UNION
Hive
除了支持 STRUCT
、ARRAY
、MAP
这些原生集合类型,还支持集合的组合,不支持集合里再组合多个集合。
举例:MAP
嵌套 ARRAY
,手动设置集合格式的数据非常麻烦,建议采用INSERT INTO SELECT
形式构造数据再插入UNION
表
//创建DUAL表,插入一条记录,用于生成数据
create table dual(d string);
insert into dual values('X');
//创建UNION表
CREATE TABLE IF NOT EXISTS uniontype_1
(
id int,
info map<STRING,array<STRING>>
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '-'
MAP KEYS TERMINATED BY ':'
STORED AS TEXTFILE;
//插入数据
insert overwrite table uniontype_1
select 1 as id,map('english',array(99,21,33)) as info from dual
union all
select 2 as id,map('english',array(44,33,76)) as info from dual
union all
select 3 as id,map('english',array(76,88,66)) as info from dual;
//查询数据
hive> select * from uniontype_1;
OK
3 {"german":[76,88,66]}
2 {"chinese":[44,33,76]}
1 {"english":[99,21,33]}
Time taken: 0.033 seconds, Fetched: 3 row(s)
hive> select * from uniontype_1 where info['english'][2]>30;
OK
1 {"english":[99,21,33]}
Time taken: 1.08 seconds, Fetched: 1 row(s)
2.3 类型转换
2.3.1 隐式转换
Hive
的类型层次中,可以根据需要进行隐式的类型转换,例如 TINYINT
与 INT
相加,则会将TINYINT
转化成INT
然后INT
做加法。隐式转换的规则大致可以归纳如下:
- 任意数值类型都可以转换成更宽的数据类型(不会导致精度丢失)或者文本类型;
- 所有的文本类型都可以隐式地转换成另一种文本类型。也可以被转换成 DOUBLE 或者 DECIMAL,转换失败时抛出异常;
- BOOLEAN 不能做任何的类型转换;
- 时间戳和日期可以隐式地转换成文本类型。
2.3.1 显式转换
同时,可以使用 CAST
进行显式的类型转换,例如:
CAST('1' as INT)
如果转换失败,CAST
返回NULL
。
本文主要讲的是hive的数据类型,结合上一篇博客 《Hive教程(03)- Hive数据模型》,就是存放数据到数据库中共有几种类型,本文完!