day7-Hive集合数据类型
一、Array 数组类型
参考数据
name | work_locations |
---|---|
zhangshan | beijing,shanghai,tianjin,hangzhou |
wangwu | changchun,chendu,wuhan,nanchang |
- 格式
array<类型>
collection items terminated by '分隔符';
创建包含数组的表
-- 创建表,两个字段(名字、工作地点)
create table test_array(
name string,
work_locations array<string>
)
-- 表示列的分隔符是“ \t ”
row format delimited fields terminated by '\t'
-- 表示集合(array)元素的分隔符是“ , ”号
collection items terminated by ',';
这里展示两种数据导入方式
load
导入- 直接写入
-- 导入数据(如果是导入外部数据的话,自己写data_for_array_type.txt)
load data local inpath '/home/data_for_array_type.txt' overwrite into table test_array;
-- 手动写入数据(插入多条数据用“ , ”号分隔,最后用“ ; ”分号收尾)
-- 注意:hive数组语法要求使用array()
insert into test_array(name, work_locations)
values('zhangsan',array('beijing', 'shanghai', 'tianjin', 'hangzhou')),
('wangwu',array('changchun', 'chendu', 'wuhan', 'nanchang'));
查看所有数据
select * from test_array;
查询
work_locations
数组中第一个元素信息
- 数组下标从 0 开始
-- 查询work_locations第一个元素
select name,work_locations[0] from test_array;
查询
work_locations
数组中元素的个数
- 注意使用:size()
- 如果选择用 count() 的话
- 会发请求给mapreduce,导致速度很慢
- count() 计算的是每行中
work_locations
数组的个数
-- 查询work_locations数组中元素个数
select name,work_locations,size(work_locations) from test_array;
查询
work_locations
数组中包含nanchang
的信息
- array_contains(数组,数据) ,可以查看指定数据是否在数组中
-- 查询work_locations中包含nanchang的信息
select * from test_array where array_contains(work_locations,'nanchang');
二、Map 映射类型
参考数据
id | name | member | age |
---|---|---|---|
1 | 张三 | father:小明#mother:小红#brother:小徐 | 28 |
2 | 李四 | father:擎天柱#mother:大黄蜂#brother:威整天 | 26 |
3 | 王五 | father:盖亚#mother:缪斯#brother:布莱克 | 29 |
4 | 老六 | father:凯撒#mother:修罗#brother:神武月 | 25 |
map` 类型:Key-Value型数据格式
- 字段与字段分隔符:“ , ”
- 需要
map
字段之间的分隔符:“ # ”map
内部k-v分隔符:" : "
- 格式
map<key类型,value类型>
不同键值对之间:collection items terminated by '分隔符'
一个键值对中,使用:map keys terminated by '分隔符'
创建包含
map
的表
-- 家庭表
create table test_map(id int,name string,member map<string,string>,age int)
row format delimited
fields terminated by ','
collection items terminated by '#'
-- 表示key-value之间用 : 分隔
map keys terminated by ':';
导入数据
-- 导入数据(如果是导入外部数据的话,自己写data_for_map_type.txt)
load data local inpath '/home/data_for_map_type.txt' overwrite into table test_map;
-- 手动写入数据
-- 注意使用:map()
insert into test_map(id,name, member,age)
values('1', '张三', map('father', '小明', 'mother', '小红', 'brother', '小徐'), '28'),
('2', '李四', map('father', '擎天柱', 'mother', '大黄蜂', 'brother', '威整天'), '26'),
('3', '王五', map('father', '盖亚', 'mother', '缪斯', 'brother', '布莱克'), '29'),
('4', '老六', map('father', '凯撒', 'mother', '修罗', 'brother', '神武月'), '25');
查询表格信息
select * from test_map;
查询father、mother这两个
map
的key
-- 查询father、mother这两个map的key
select id,name,member['father'] father,member['mother'] mother,age from test_map;
查询全部
map
的key,使用 map_keys 函数,结果是array类型
-- 查询全部 map的key,使用map_keys函数,结果是array类型
select id,name,map_keys(member) as relation from test_map;
查询全部
map
的value,使用map_values函数,结果是array类型
-- 查询全部map的value,使用map_values函数,结果是array类型
select id,name,map_values(member) as relation from test_map;
查询
map
类型的k-v对数量
-- 查询map类型的k-v对数量
select id,name,size(member) num from test_map;
查询
map
的value中有擎天柱的数据
-- 查询map的value中有擎天柱的数据
select * from test_map where array_contains(map_values(member),'擎天柱');
三、Struct 结构类型
参考数据
id | info(name,age) |
---|---|
1 | 周杰轮,11 |
2 | 林均杰,16 |
3 | 刘德滑,21 |
4 | 张学油,26 |
5 | 蔡依临,23 |
- 格式
struct<name:string,age:int>
struct只需:collection items terminated by '分隔符';
建表语句
create table test_struct(id string,info struct<name:string,age:int>)
row format delimited
fields terminated by '#'
collection items terminated by ':';
导入数据
-- 导入数据(如果是导入外部数据的话,自己写data_for_struct_type.txt)
-- 数据格式:1#周杰轮:11
load data local inpath '/home/data_for_struct_type.txt' overwrite into table test_map;
-- 手动写入数据
-- 注意使用:named_struct(字段名1,待插入数据,字段名2,待插入数据...)
insert into test_struct(id,info)
values('1', named_struct('name','周杰轮','age',11)),
('2', named_struct('name','林均杰','age',16)),
('3', named_struct('name','刘德滑','age',21)),
('4', named_struct('name','张学油','age',26)),
('5', named_struct('name','蔡依临','age',23));
查询数据
-- 查询全部
select * from test_struct;
直接使用列名.子列名即可从
struct
中取出子列查询
-- 列名.子列名 查询
select id,info.name from test_struct;