目录
hvie的SerDe机制
其中ROW FORMAT是语法关键字,DELIMITED和SERDE二选其一。本次我们主要学习DELIMITED关键字相关知识点
如果使用delimited: 表示底层默认使用的Serde类:LazySimpleSerDe类来处理数据。
如果使用serde:表示指定其他的Serde类来处理数据,支持用户自定义SerDe类。Hive默认的序列化类: LazySimpleSerDe
包含4种子语法,分别用于指定字段之间、集合元素之间、map映射 kv之间、换行的分隔符号。
在建表的时候可以根据数据的类型特点灵活搭配使用。
COLLECTION ITEMS TERMINATED BY '分隔符' : 指定集合类型(array)/结构类型(struct)元素的分隔符
MAP KEYS TERMINATED BY '分隔符' : 表示映射类型(map)键值对之间用的分隔
复杂类型
复杂类型建表格式:
...
[row format delimited] # hive的serde机制
[fields terminated by '字段分隔符'] # 自定义字段分隔符固定格式
[collection ITEMS terminated by '集合分隔符'] # 自定义array同类型集合和struct不同类型集合
[map KEYS terminated by '键值对分隔符'] # 自定义map映射kv类型
[lines terminated by '\n'] # # 默认即可
...;
hive复杂数据类型:
数组: array 映射: map 架构体: struct
array类型:又叫数组类型,存储同类型的单数据集合
建表指定类型: array<数据类型>
取值:字段名[索引] 注意:索引从0开始
获取长度: size(字段名)
判断是否包含某个数据: array_contains(字段名,某数据)
struct类型:又叫结构类型,可以存储不同类型单数据的集合
建表指定类型:strcut<子字段名1:数据类型1,子字段名2:数据类型2,...>
取值:字段名.子字段名n
map类型:又叫映射类型,存储键值对数据的映射(根据key找value)
建表指定类型:map<key类型,value类型>
取值:字段名[key]
获取长度:size(字段名)
获取所有的key:map_keys()
获取所有的values:map_values()
array示例
需求: 已知data_for_array_type.txt文件,存储了学生以及居住过的城市信息,要求建hive表把对应的数据存储起来
-- 演示使用array类型映射数据
-- 创建表
create table student_message(
name string,
adress array<string>
)row format delimited fields terminated by '\t'
collection items terminated by ',';
-- 加载数据
load data inpath '/source/data_for_array_type.txt' into table student_message;
-- 验证数据
select * from student_message;
-- 需求: 查询zhangsan的地址有几个?
select name,size(adress) adress from student_message where name='zhangsan';
-- 需求: 查询zhangsan的第二个地址?
select name,adress[1] adress from student_message where name='zhangsan';
-- 需求: 查询zhangsan是否在tianjin住过?
select name,array_contains(adress,'tianjin') from student_message where name='zhangsan';
struct示例
需求: 已知data_for_struct_type.txt文件存储了用户姓名和年龄基本信息,要求建hive表把对应的数据存储起来
-- 演示使用struct类型映射数据
-- 创建表
create table student(
id int,
ifo struct<name:string,age:string>
) row format delimited fields terminated by '#'
collection items terminated by ':';
-- 加载数据
load data inpath '/source/data_for_struct_type.txt' into table student;
-- 验证数据
select * from student;
-- 需求: 获取所有的姓名
select ifo.name from student;
-- 需求: 获取所有学生的年龄并倒序排列
select ifo.name,ifo.age from student sort by age desc;
map示例
需求: 已知data_for_map_type.txt文件存储了每个学生详细的家庭信息,要求建hive表把对应数据存储起来
-- 演示map类型的应用
-- 创建表
create table family_message (
id int,
name string,
ifo map<string,string>,
age int
)row format delimited fields terminated by ','
collection items terminated by '#'
map keys terminated by ':';
-- 加载数据
load data inpath '/source/data_for_map_type.txt' into table family_message;
-- 验证数据
select * from family_message;
-- 需求:查看所有人的父母信息
select name,ifo['father'] father,ifo['mother'] mother from family_message;
-- 需求: 查看所有人的家庭相关角色
select name,map_keys(ifo) from family_message;
-- 需求: 查看所有人的家庭相关姓名
select name,map_values(ifo) from family_message;
-- 需求: 查看所有人的家庭相关人员个数
select name,size(ifo) from family_message;
-- 需求: 查看马大云是否有弟弟
select name,array_contains(map_keys(ifo),'brother') from family_message where name='马大云';