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

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 在Hive中,`Array`、`Map`和`Struct`是三种特殊的数据类型。`Array`用于存储相同类型的列表,如`select array(1, "1", 2, 3, 4, 5)`会产生一个整数数组。`Map`是键值对集合,键值类型需一致,如`select map(1, 2, 3, "4")`会产生一个整数到整数的映射。`Struct`表示结构体,有固定数量和类型的字段,如`select struct(1, 2, 3, 4)`创建一个无名结构体。这些类型支持嵌套使用,允许更复杂的结构数据存储。例如,可以创建一个包含用户结构体的数组来存储多用户信息

Array

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

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

select array(1,2,3,4,5);

image.png

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

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

image.png

Array 数据类型的使用

创建测试表:

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

插入一些测试数据:

insert into table array_test values(array("Jack","Mary","Lily"));

查询表数据:

select * from array_test;

image.png

获取数组中的数据

select
  users,
  users[0] first_col,
  users[10] null_col
from
  array_test;

image.png

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

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

select
  users,
  array_contains(users,"Jack") is_save_Jack,
  array_contains(users,"Tom") is_save_Tom
from
  array_test;

image.png

Map

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

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

select map(1,2,3,4);

image.png

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

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

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

image.png

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

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

select map(1,2,3,4,5);

image.png

Map 数据类型的使用

创建测试表:

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

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

insert into table map_test values (map("name","Mary","age","20")),(map("name","Jack","age","21"));

查询表数据:

select * from map_test;

image.png

获取 Map 中的数据

select
  users,
  users["name"],
  users["age"]
from
  map_test;

image.png

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

select
  users,
  users["ggg"]
from
  map_test;

image.png

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

select
  users,
  users["Name"],
  users["AGE"]
from
  map_test;

image.png

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

select
  users,
  map_keys(users),
  map_values(users)
from
  map_test;

image.png

Struct

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

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

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

select struct(1,2,3,4);

image.png

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

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

select named_struct(1,2,3,4);

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

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

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

image.png

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

Struct 数据类型的使用

创建测试表:

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

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

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

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

查询表数据:

select * from struct_test;

image.png

获取 Struct 中的数据

select
  users,
  users.id,
  users.name,
  users.age
from
  struct_test;

image.png

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

select
  users,
  users.ggg
from
  struct_test;

image.png

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

select
  users,
  users.ID,
  users.NaME,
  users.Age
from
  struct_test;

image.png

嵌套使用

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

创建测试表:

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

插入一些测试数据:

insert into table test values(array(named_struct("id",1001,"name","Jack")));

查询表数据:

select * from test;

image.png

获取嵌套格式中的数据

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

select
  users,
  users[0].id,
  users[0].name
from
  test;

image.png

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

相关文章
|
3月前
|
JavaScript 前端开发
JavaScript Array map() 方法
JavaScript Array map() 方法
|
6月前
|
存储 分布式计算 DataWorks
MaxCompute产品使用合集之要存储用户的下单所有产品,然后查询时要进行产品分组的,一般这种字段要使用ARRAY还是MAP
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
7月前
|
JavaScript
js Array map映射对象多个属性
js Array map映射对象多个属性
47 0
|
7月前
|
SQL 数据采集 数据挖掘
大数据行业应用之Hive数据分析航班线路相关的各项指标
大数据行业应用之Hive数据分析航班线路相关的各项指标
201 1
|
7月前
|
SQL 存储 大数据
【大数据技术Hadoop+Spark】Hive基础SQL语法DDL、DML、DQL讲解及演示(附SQL语句)
【大数据技术Hadoop+Spark】Hive基础SQL语法DDL、DML、DQL讲解及演示(附SQL语句)
268 0
|
SQL 存储 大数据
黑马程序员-大数据入门到实战-分布式SQL计算 Hive 语法与概念
黑马程序员-大数据入门到实战-分布式SQL计算 Hive 语法与概念
149 0
|
7月前
|
SQL 分布式计算 数据库
【大数据技术Spark】Spark SQL操作Dataframe、读写MySQL、Hive数据库实战(附源码)
【大数据技术Spark】Spark SQL操作Dataframe、读写MySQL、Hive数据库实战(附源码)
285 0
|
7月前
|
SQL 存储 分布式计算
【大数据技术Hadoop+Spark】Hive数据仓库架构、优缺点、数据模型介绍(图文解释 超详细)
【大数据技术Hadoop+Spark】Hive数据仓库架构、优缺点、数据模型介绍(图文解释 超详细)
1119 0
|
2月前
|
SQL 分布式计算 Java
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
53 0
|
5月前
|
SQL 分布式计算 大数据
大数据处理平台Hive详解
【7月更文挑战第15天】Hive作为基于Hadoop的数据仓库工具,在大数据处理和分析领域发挥着重要作用。通过提供类SQL的查询语言,Hive降低了数据处理的门槛,使得具有SQL背景的开发者可以轻松地处理大规模数据。然而,Hive也存在查询延迟高、表达能力有限等缺点,需要在实际应用中根据具体场景和需求进行选择和优化。