Hive复杂类型之 array struct map

目录

hvie的SerDe机制

​编辑

复杂类型

array示例

struct示例

map示例


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='马大云';
  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值