直播软件下载网站,商标设计logo免费软件,怎么做企业网站二维码,威海网站建设在哪Hive的数据结构 前言一、array数组类型二、map键值对集合类型三、struct结构体类型 前言
Hive是一个基于Hadoop的数据仓库基础设施#xff0c;用于处理大规模分布式数据集。它提供了一个类似于SQL的查询语言#xff08;称为HiveQL#xff09;#xff0c;允许用户以类似于关… Hive的数据结构 前言一、array数组类型二、map键值对集合类型三、struct结构体类型 前言
Hive是一个基于Hadoop的数据仓库基础设施用于处理大规模分布式数据集。它提供了一个类似于SQL的查询语言称为HiveQL允许用户以类似于关系型数据库的方式查询和分析存储在Hadoop集群中的数据。 Hive常作为离线数仓的分析工具当面临Json数据时Hive需要用到其数据结构构建出一张Json表才得以操作Json数据(Hive4.0推出了Json解析) 一、array数组类型
数组是一组具有相同类型的变量的集合。 这些变量称为数组的元素每个数组元素都有一个编号编号从零开始。
数组类型的创建:
drop table if exists test_datatype;
create external table test_datatype(ids arrayint,
) comment 数据结构测试表
location test/test_datatype;创建表字段时使用Array类型需要声明其泛型如果在后续的操作中向该表字段插入了一个包含string类型的arrayHive 在数据加载过程中会根据目标表的声明进行数据类型推断和转换。如果插入的数组元素与目标表声明的数据类型不匹配Hive 会尝试进行隐式类型转换。在这种情况下Hive 会尝试将字符串转换为整数类型。 Tip:隐式类型转换可能导致数据丢失或错误。如果类型转换失败Hive 可能会将其转换为 NULL 值。
以下构建一个简单的array数组对象:
查询语句
selectids,array(ids[0],ids[6]),array_contains(ids,milet)
from (select array(aimyon,aimer,vaundy,Ado,1,3.6) as ids)t1执行结果
ids[aimyon,aimer,vaundy,Ado,1,3.6]
array(ids[0],ids[5])[aimyon,null]
array_contains(ids,milet) falseArray 类型可以存储具有相同数据类型的元素。这意味着数组中的每个元素都应该是相同的数据类型。上述的Hql中使用了string和int类型但是查询结果显示的都是string类型。Array类型通过下标取出元素如果下标越界取出的元素为nullarray_contains()能够检索数组是否包含该元素该函数返回布尔类型。 二、map键值对集合类型
Map 类型是一种键值对的集合其中的键和值可以是任何 Hive 支持的数据类型。Map 类型用于表示一种关联关系类似于其他编程语言中的字典或哈希表。
Map类型的创建:
drop table if exists test_datatype;
create external table test_datatype(dat mapstring,string
) comment 数据结构测试表
location test/test_datatype;创建Map类型时需要声明其键值对泛型,Map 类型的语法为 MAPkey_type, value_type其中 key_type 和 value_type 分别表示键和值的数据类型。 以下构建一个简单的map对象:
查询语句
selectdat,dat[a],map_keys(dat),if(array_contains(map_keys(dat),a),true,false)
from (select map(a,b,1,d) dat)t;执行结果
dat{a:b,1:d}
dat[a]b
map_keys(dat)[a,1]
if(array_contains(map_keys(dat),a),true,false)truemap类型使用map[‘key_name’]的方式取出值并且hive提供了map_keys,map_values获取所用的key和value这在一些判断场景下非常好使。 Tip:map的key的类型可以不统一但是value类型必须统一。
三、struct结构体类型
在 Hive 中结构体Struct类型是一种用于组合多个字段的复合数据类型。结构体类型允许你在一个列中存储多个相关的值并将它们作为一个单元进行处理。
结构体类型由多个字段组成每个字段都有一个名称和一个数据类型。你可以将结构体类型用作表的列类型或者作为其他复合数据类型如数组或映射的元素类型。
struct类型的创建:
drop table if exists test_datatype;
create external table test_datatype(obj structid:int,name:string
) comment 数据结构测试表
location test/test_datatype;创建struct结构体时需要声明所有使用到的类型结构体创建之后其属性不能再做更改。 以下构建一个简单的struct对象:
查询语句
select struct(a,b,c,d) {col1:a,col2:b,col3:c}
select name_struct(a,b,c,1) {a:b,c:1}select obj,obj.a
from (select named_struct(a, b, c, 1) obj) t1;
执行结果
obj {a:b,c:1}
obj.a b结构体通过点的方式访问元素结构体与map不同一旦创建属性个数就不能更改。结构体定义后其类型不能做更改 name:stringage:int map类型定义后其每个元素的值类型就需要确定了map string:stiring 总结: 遇到Json属性为 {key1:value1key2:value2 …} value类型都统一的并且个数不确定的可以使用map类型。value类型不统一并且个数确定的可以使用struct类型。 遇到类似数组的json数据: actions: [{ -- 动作(事件)action_id: favor_add, -- 动作iditem: 3, -- 目标iditem_type: sku_id, -- 目标类型ts: 1585744376605 -- 动作时间戳}数据结构可以嵌套使用:array struct key1:string,key2:int 上述json中actions为数组元素个数不确定并且元素都能够用struct array泛型 mapstring:string structname:string,age:int
具体问题具体分析根据数据情况选择合适的数据结构。