day7-Hive复杂数据类型

day7-Hive集合数据类型

一、Array 数组类型

参考数据

namework_locations
zhangshanbeijing,shanghai,tianjin,hangzhou
wangwuchangchun,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() 的话
    1. 会发请求给mapreduce,导致速度很慢
    2. 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 映射类型

参考数据

idnamememberage
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;

在这里插入图片描述

查询fathermother这两个 mapkey

-- 查询father、mother这两个map的key
select id,name,member['father'] father,member['mother'] mother,age from test_map;

在这里插入图片描述

查询全部 mapkey,使用 map_keys 函数,结果是array类型

-- 查询全部 map的key,使用map_keys函数,结果是array类型
select id,name,map_keys(member) as relation from test_map;

在这里插入图片描述

查询全部 mapvalue,使用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;

在这里插入图片描述

查询 mapvalue中有擎天柱的数据

-- 查询map的value中有擎天柱的数据
select * from test_map where array_contains(map_values(member),'擎天柱');

在这里插入图片描述

三、Struct 结构类型

参考数据

idinfo(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;

在这里插入图片描述

总结

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萌神想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值