当前位置:   article > 正文

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

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 的建表语句

老样子,直接上图:

结论:

  1. --数据类型带结构体 struct的建表语句
  2. drop table if exists db_tmp.stud_info ;
  3. create table db_tmp.stud_info (
  4. name string comment '姓名'
  5. ,info struct<sex:string,city:string,hight:int> comment '信息'
  6. ,ETL_time string comment 'ETL时间'
  7. ) ;

3,结构体strcut 的数据写入

3.1,方法一

如上图一样,可以自己去定义数据的内容。

  1. --数据写入
  2. insert into table db_tmp.stud_info
  3. select '小明' , named_struct('sex','男' ,'city','北京', 'hight',180)
  4. ubion all
  5. select '小红' , named_struct('sex','女' ,'city','上海', 'hight',175)
  6. ........

注意,很多资料说 

insert into table db_tmp.stud_info 

values( '小明' , named_struct('sex','男'   ,'city','北京',    'hight',180) ,'2024-05-27' )

这种方法,根本说不通,emmm至少在hive是不行的,会直接报错。

3.2,方法二

当然,也可以select其他表的字段信息拼接成为 结构体字段。

  1. -- 从其他的表借用字段组合成为 struct
  2. -- 假如有一张表,刚好有对应的姓名,性别,城市,身高字段
  3. insert into table db_tmp.stud_info
  4. select name
  5. , named_struct('sex',sex ,'city',city , 'hight',hight) as info
  6. ,'2024-05-27' as etl_time
  7. from xxxxx

再举个例子:

下图给出建表语句,数据插入sql,以及查询语句。(select 的是时间维表的字段信息)

3.3,方法三

当然,如果你有数据文件,可以根据数据文件的信息,来进行建表。

然后加载数据到表对应的HDFS路径下自动映射成表。

  1. -- 【方法1】数据加载语句: into 到表
  2. load data local inpath 'date/bdetl/adm/sql/stud_info.csv' into table db_tmp.stud_info ;
  3. -- 【方法2】数据加载语句: put到表的存储路径下
  4. 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映射的数据。

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/819763
推荐阅读
相关标签
  

闽ICP备14008679号