1. Hive 复杂数据类型
-
Hive 复杂数据类型包括数组(ARRAY)、映射(MAP)和结构体(STRUCT),具体如下所示:
- ARRAY
- ARRAY 类型是由一系列相同数据类型的元素组成,这些元素可以通过下标来访问。
- 比如:有一个 ARRAY 类型的变量 fruits,它是由 [‘apple’,‘orange’,‘mango’] 组成,那么我们可以通过 fruits[1]来访问元素 orange,因为 ARRAY 类型的下标是从 0 开始的。
- MAP
- MAP 包含 key->value 键值对,可以通过 key 来访问元素。
- 比如:”userlist” 是一个 map 类型,其中 username 是 key,password 是 value;那么我们可以通过 userlist[‘username’] 来得到这个用户对应的 password。
- STRUCT
- STRUCT 可以包含不同数据类型的元素。
- 这些元素可以通过”点语法”的方式来得到所需要的元素,比如 user 是一个 STRUCT 类型,那么可以通过 user.address 得到这个用户的地址。
-
示例:
CREATE TABLE student( name STRING, favors ARRAY<STRING>, scores MAP<STRING, FLOAT>, address STRUCT<province:STRING, city:STRING, detail:STRING, zip:INT> ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' COLLECTION ITEMS TERMINATED BY ';' MAP KEYS TERMINATED BY ':';
- 字段说明:
- 字段 name 是基本类型,favors 是数组类型,可以保存很多爱好,scores 是映射类型,可以保存多个课程的成绩,address 是结构类型,可以存储住址信息;
- ROW FORMAT DELIMITED 是指明后面的关键词是列和元素分隔符的;
- FIELDS TERMINATED BY 是字段分隔符;
- COLLECTION ITEMS TERMINATED BY 是元素分隔符(Array 中的各元素、Struct 中的各元素、Map 中的 key-value 对之间);
- MAP KEYS TERMINATED BY 是 Map 中 key 与 value 的分隔符;
- LINES TERMINATED BY 是行之间的分隔符;
- STORED AS TEXTFILE 指数据文件上传之后保存的格式。
- 优势
- 在关系型数据库中,我们至少需要三张表来定义,包括学生地址信息表、爱好表、成绩表;
- 但在 Hive 中通过一张表就可以搞定了;
- 也就是说,复合数据类型把多表关系通过一张表就可以实现了。
- 字段说明:
2. ARRAY
-
创建表
create table test.person(name string,work_locations array<string>) row format delimited fields terminated by ' ';
-
数据内容
huangbo beijing,shanghai,tianjin,hangzhou xuzheng changchu,chengdu,wuhan wangbaoqiang dalian,shenyang,jilin
-
加载数据
load data local inpath '/home/score.txt' into table test.score;
-
查询数据
select * from test.person; select name from test.person; select work_locations from test.person; select work_locations[0] from test.person;
3. MAP
- 创建表
create table test.score(name string, scores map<string,int>) row format delimited fields terminated by ' ' collection items terminated by ',' map keys terminated by ':';
- 数据内容
huangbo yuwen:80,shuxue:89,yingyu:95 xuzheng yuwen:70,shuxue:65,yingyu:81 wangbaoqiang yuwen:75,shuxue:100,yingyu:75
- 加载数据
load data local inpath '/home/score.txt' into table test.score;
- 查询数据
select * from test.score; select name from test.score; select scores from test.score; select s.scores['yuwen'] from test.score s;
4. STRUCT
- 创建表
create table test.structtable(id int,course struct<name:string,score:int>) row format delimited fields terminated by ' ' collection items terminated by ',';
- 数据内容
1 english,80 2 math,89 3 chinese,95
- 加载数据
load data local inpath '/home/structtable.txt' into table test.structtable;
- 查询数据
select * from test.structtable; select id from test.structtable; select course from test.structtable; select t.course.name from test.structtable t; select t.course.score from test.structtable t;