Hive---hive的复杂数据类型(Array,Map,Struct)

array

数据源是一个省份和其所包含城市组成的数组
河北|石家庄,保定,邯郸,张家口,北戴河
江西|南昌,九江,赣州,鹰潭,井冈山

建表过程

create table if not exists arr2(
province string,
city array<string>
)
comment 'this is table'
row format delimited 
fields terminated by '|'
collection items terminated by ','        #用来定义数组中每一个元素的分隔符
tblproperties('author'='laocao','dt'='2019-04-19') ;
#用来定义hive表的一些属性,tblproperties,跟复杂数据类型并没有特定关系,可以写在任何表中


load data local inpath '/root/array.txt' into table arr2 ; #加载数据

使用array中元素,访问数组中的某一个元素

hive中数组元素的使用,同样是采用下标的方式,下标从0开始

select province,city[0] from arr2;

数组长度

size()函数

select province,size(city) from arr2 where size(city)>4;

查看数组中的每一个元素explode()

explode()会将数组元素展开展示

select explode(city) from arr2;

注意:explode()函数只是生成了一个数据的展示方式,无法在表中产生一个新的数据列,即select province,explode(city) from arr2 会报错的

确定数组中是否含有某一个元素

arr_contains(数组名,值)   
!arr_contains(数组名,值) 

此处注意,如果不使用该函数,而直接使用 “值 in/not in 数组”,会报错,会报类型不匹配的错误,关于in/not in在hive0.3.2版本以后就已经支持了

虚拟表 lateral view

lateral view 会将explode生成的结果放到一个虚拟表中,然后这个虚拟表会和输入行即每个province进行join,来达到数据聚合的目的。

浅显理解,此处的join,就是把虚拟表中的数据和每个province对应的后面数组中元素进行对比,假如一样,则进行聚合

select province, scity    # 注意:这里用的是scity,是和lateral view()保持一致的
from arr2
lateral view explode(city) city as scity;   
#要进行聚合的虚拟表,lateral view explode(字段) 虚拟表名 as 虚拟表字段    

由上述得数组的使用场景 : 使用数组减少了数据的冗余,只输出了一个省份而不是一个城市输出一个省份

纵向转横向,横向转纵向

collect_set():纵向转横向,将多行数写入一行,此方法会对该列去重
collect_list():作用同上,但是该方法不会对该列去重
此时,默认的数据之间的分割符是逗号(,),也可以使用concat_ws()方法来指定分隔符

select province,collect_set(scity) as city
from arr_tmp
group by province
;      
效果:   河北 ["石家庄,保定,邯郸,秦皇岛,北戴河"]

select province,concat_ws(',',collect_set(scity)) as city
from arr_tmp
group by province
; 

array():横向转纵向

select array("1","2","3");           
效果:["1","2","3"]1:age字段16 17 18
使用完array()
16
17 
18

map

struct

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值