想写这篇文章蛮久了,但这个数据类型,确实很少用,翻遍了代码库的所有代码,也没有找到。
但,之前分享过的 Hive复杂数据类型之 array 数组,
Hive复杂数据类型之array数组_hive 建表设置array类型-CSDN博客
Hive复杂数据类型之 map 映射,
hive复杂数据类型之 map映射_hive复杂数据类型map-CSDN博客
HIVE之JSON字符串与(array数组,map映射,struct结构体),
HIVE之JSON字符串与(array数组,map映射,struct结构体)-CSDN博客
就差分享struct结构体一篇了,幸不辱命。
1, 什么是 struct结构体
emmmm,它是用来描述一群类似对象的数据记录方法,有相同的属性。
存放N种不同类型的数据,结构体,也是集合的一种。
比如说,用 struct结构体 来描述一个班级所有小学生的信息。
除了学生id之外,所有信息字段(性别,体重,身高,爱好...)都可以放进去
stud_id | stud_info |
小明 | {'sex':'man','weight':'30kg','hight(cm)':123,'hobby':'画画'} |
大红 | {'sex':'woman','weight':'28kg','hight(cm)':112,'hobby':'发呆'} |
结论:
所以,它是描述一群类似对象(同一班级学生)的数据记录方法,
可存放N种不同类型的数据(字符串,数值...),
注意,每个对象再结构体的信息属性都是相同的,只是属性值不一样,
也是集合(每个属性:属性值, 就是一个元素)的一种。
2,结构体strcut 的建表语句
老样子,直接上图:
结论:
--数据类型带结构体 struct的建表语句
drop table if exists db_tmp.stud_info ;
create table db_tmp.stud_info (
name string comment '姓名'
,info struct<sex:string,city:string,hight:int> comment '信息'
,ETL_time string comment 'ETL时间'
) ;
3,结构体strcut 的数据写入
3.1,方法一
如上图一样,可以自己去定义数据的内容。
--数据写入
insert into table db_tmp.stud_info
select '小明' , named_struct('sex','男' ,'city','北京', 'hight',180)
ubion all
select '小红' , named_struct('sex','女' ,'city','上海', 'hight',175)
........
注意,很多资料说
insert into table db_tmp.stud_info
values( '小明' , named_struct('sex','男' ,'city','北京', 'hight',180) ,'2024-05-27' )
这种方法,根本说不通,emmm至少在hive是不行的,会直接报错。
3.2,方法二
当然,也可以select其他表的字段信息拼接成为 结构体字段。
-- 从其他的表借用字段组合成为 struct
-- 假如有一张表,刚好有对应的姓名,性别,城市,身高字段
insert into table db_tmp.stud_info
select name
, named_struct('sex',sex ,'city',city , 'hight',hight) as info
,'2024-05-27' as etl_time
from xxxxx
;
再举个例子:
下图给出建表语句,数据插入sql,以及查询语句。(select 的是时间维表的字段信息)
3.3,方法三
当然,如果你有数据文件,可以根据数据文件的信息,来进行建表。
然后加载数据到表对应的HDFS路径下自动映射成表。
-- 【方法1】数据加载语句: into 到表
load data local inpath 'date/bdetl/adm/sql/stud_info.csv' into table db_tmp.stud_info ;
-- 【方法2】数据加载语句: put到表的存储路径下
hdfs dfs -put date/bdetl/adm/sql/stud_info.csv /user/hive/warehouse/temp.db/stud_info
4,结构体strcut 的数据取值
可以采用 struct的 【字段名.属性】 来获取 属性值
5,可以和 explode 爆炸函数一块使用嘛
虽然它是复杂结构,但是它却不能和explode一块使用!!
注意报错信息:explode函数炸开array数组,map映射的数据。
欢迎一键三连,您的每一个点赞收藏关注都是我持续奋斗的动力。
后续会分享更多优质的,不可思议的内容。