文章目录
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