Hive复杂数据类型之 Struct结构体

想写这篇文章蛮久了,但这个数据类型,确实很少用,翻遍了代码库的所有代码,也没有找到。

但,之前分享过的 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_idstud_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映射的数据。

欢迎一键三连,您的每一个点赞收藏关注都是我持续奋斗的动力。

后续会分享更多优质的,不可思议的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不被定义喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值