Hive 特殊的数据类型 Array、Map、Struct

Array

数组类型,存储数据类型一致的列表数据。

我们可以使用 array 方法来创建一个数组,如下所示:

sql 复制代码
select array(1,2,3,4,5);

如果其中的数据类型不一致,那么它会转换成统一的数据类型(前提是能够进行转换):

sql 复制代码
-- 同时存在整型和字符型 会统一转换为整型
select array(1,"1",2,3,4,5);

Array 数据类型的使用

创建测试表:

sql 复制代码
create table if not exists array_test(
users array<string>
)
row format delimited fields terminated by '\t';

插入一些测试数据:

sql 复制代码
insert into table array_test values(array("Jack","Mary","Lily"));

查询表数据:

sql 复制代码
select * from array_test;

获取数组中的数据

sql 复制代码
select
  users,
  users[0] first_col,
  users[10] null_col
from
  array_test;

获取数组值的方式和我们在 Java 中一样,采用下标的方式访问,当访问的下标超过数组的长度时,并不会报错,它会返回 null 值。

如果想要判断数组中是否存在某个值,可以使用 array_contains 方法:

sql 复制代码
select
  users,
  array_contains(users,"Jack") is_save_Jack,
  array_contains(users,"Tom") is_save_Tom
from
  array_test;

Map

Map 是 KV 键值对类型,其中存储的字段数量可多可少,但是 KV 键值对的数据类型必须提前确定。

同样,在 Hive 中也提供了创建 Map 键值对的方法 map,如下所示:

sql 复制代码
select map(1,2,3,4);

它会将前面的数据当作 Key,后面的数据当作 Value,两两组合,形成 Map 集合。

如果其中的数据类型不一致,它同样会转换成统一的数据类型:

sql 复制代码
-- 同时存在整型和字符型 会统一转换为整型
select map(1,2,3,"4");

这里值 Value 中存在整型和字符型数据类型不统一的情况,它会统一将值 Value 都转换成字符型。

如果无法形成两两组合的键值对,则会直接报错:

sql 复制代码
select map(1,2,3,4,5);

Map 数据类型的使用

创建测试表:

sql 复制代码
create table if not exists map_test(
users map<string,string>
)
row format delimited fields terminated by '\t';

往刚刚创建的表中插入一些测试数据:

sql 复制代码
insert into table map_test values (map("name","Mary","age","20")),(map("name","Jack","age","21"));

查询表数据:

sql 复制代码
select * from map_test;

获取 Map 中的数据

sql 复制代码
select
  users,
  users["name"],
  users["age"]
from
  map_test;

如果获取一个不存在的键时,它会返回 null 值:

sql 复制代码
select
  users,
  users["ggg"]
from
  map_test;

在查询时,需要注意,Map 会区分键的大小写:

sql 复制代码
select
  users,
  users["Name"],
  users["AGE"]
from
  map_test;

如果想要获取所有的键或者值,可以使用 map_keys() 或者 map_values()

sql 复制代码
select
  users,
  map_keys(users),
  map_values(users)
from
  map_test;

Struct

Struct 是结构体数据类型,其中存储对象的相关信息,例如:用户ID、用户名、账号、密码等

Struct 中的数据数量以及类型都必须是确定的。

在 Hive 中提供了创建 Struct 键值对的方法 struct,如下所示:

sql 复制代码
select struct(1,2,3,4);

它会将所有的参数都当作为值,由系统自动生成键名。

如果想要用户来设置键名,那么可以使用另一个方法 named_struct

sql 复制代码
select named_struct(1,2,3,4);

和 Map 一样,它会将前面的数据当作 Key,后面的数据当作 Value,两两组合,形成结构体。

如果其中的数据类型不一致,它同样会转换成统一的数据类型:

sql 复制代码
-- 同时存在整型和字符型 会统一转换为整型
select named_struct(1,2,3,"4");

这里值 Value 中存在整型和字符型数据类型不统一的情况,它会统一将值 Value 都转换成字符型。

Struct 数据类型的使用

创建测试表:

sql 复制代码
create table if not exists struct_test(
users struct<id:int,name:string,age:int>
)
row format delimited fields terminated by '\t';

往刚刚创建的表中插入一些测试数据:

sql 复制代码
insert into table struct_test values (named_struct("id",1001,"name","Mary","age",20)),(named_struct("id",1002,"name","Jack","age",21)),(named_struct("id",1003,"name","Tom","age",20));

如果数据的类型与定义的类型产生冲突,它会直接报错。

查询表数据:

sql 复制代码
select * from struct_test;

获取 Struct 中的数据

sql 复制代码
select
  users,
  users.id,
  users.name,
  users.age
from
  struct_test;

如果获取一个不存在的键时,它会直接报错:

sql 复制代码
select
  users,
  users.ggg
from
  struct_test;

在查询时,需要注意,它和 Map 不同,忽略大小写:

sql 复制代码
select
  users,
  users.ID,
  users.NaME,
  users.Age
from
  struct_test;

嵌套使用

在 Hive 中,我们可以嵌套使用特殊的数据类型。

创建测试表:

sql 复制代码
create table if not exists test(
users array<struct<id:int,name:string>>
)
row format delimited fields terminated by '\t';

插入一些测试数据:

sql 复制代码
insert into table test values(array(named_struct("id",1001,"name","Jack")));

查询表数据:

sql 复制代码
select * from test;


获取嵌套格式中的数据

其实和前面一样,每层使用各自的访问方式就行了。

sql 复制代码
select
  users,
  users[0].id,
  users[0].name
from
  test;

其余格式之间的嵌套这里就不再说明了,同学们可以自己尝试。

相关推荐
2601_962218618 分钟前
万象生鲜系统订单全生命周期状态同步技术实现业务可视
大数据·数据库·人工智能·python·算法
南京兴帝文化传媒有限公司11 分钟前
实体理疗店地图优化实操:关键词布局+AI问答如何带来新客翻倍增长
大数据·人工智能·geo 优化·geo优化避坑·ai搜索获客·宣城企业数字化
Wang's Blog26 分钟前
Java框架快速入门:Spring Security+OAuth2之用户注册与唯一性校验实现
java·数据库·spring
跨境生态圈1 小时前
2026谷歌SEO快速排名深度解析:合规起量、避坑指南与实战落地策略
数据库·人工智能·爬虫·搜索引擎·chatgpt
JavaPub-rodert1 小时前
Docker 安装 MySQL 完整教程:从零部署数据库,到生产环境持久化配置
数据库·mysql·docker
隔窗听雨眠1 小时前
MySQL整库迁移至KaiwuDB完全指南:从数据类型映射到生产切换的系统性实践
数据库·mysql
xhbh6662 小时前
中小企业 Redis 运维,如何安全归档 RDB、AOF 备份文件?
运维·数据库·缓存·数据备份·文件备份·同步备份·号码备份
微财经观圈2 小时前
广柔低发尘管线包|洁净车间专用防护方案
大数据
彧azz2 小时前
Git 入门实操实例:从安装到远程仓库全流程
大数据·笔记·git·学习·elasticsearch
勤奋的树懒2 小时前
从手写 SQL 到 Windows 工具:致远 OA 文件清理实践
数据库·sql·windows server·致远oa