1.2.6 聚合函数
1、size:集合中元素个数
select size(friends) from test; --2/2 每一行数据中的friends集合里的个数
2、map:创建map集合
--语法:map(key1,value1,key2,value2,...) --说明:根据输入的key和value对构建map类型 select map('zhm',1,'zhm2',2); 输出:{"zhm":1,"zhm2":2}
3、map_keys:返回map中的key
select map_keys(map('zhm',1,'zhm2',2)) 输出:["zhm","zhm1"]
4、map_keys:返回map中的key
select map_values(map('zhm',1,'zhm2',2)) 输出:[1,2]
5、array声明array集合
--语法:array(val1,val2,...) --说明:根据输入的参数构建数组array类 select array('1','2','3','4'); 输出:["1","2","3","4"]
6、array_contains:判断array中是否包含某元素
select array_contains(array('a','b','c'),'a'); 输出:true
7、sort_array:将array中的元素排序
select sort_array(array('a','d','c')) 输出:['a','c','d']
8、struct声明struct中的各属性
--语法:struct(val1,val2,val3,...) --说明:根据输入的参数构建结构体struct类 select struct('name','age','weight'); 输出:{"col1":"name","col2":"age","col3":"weight"}
9、named_struct声明struct的属性和值
select named_strcut('name','zhm','age',18,'weight',80); 输出:{"name":"zhm","age":18,"weight":80}
1.3 高级聚合函数
多进一出(多行传入,一行输出)
1、collect_list() 收集并形成list集合,结果不去重
select sex, collect_list(job) from employee group by sex
结果:
女 [“行政”,“研发”,“行政”,“前台”]
男 [“销售”,“研发”,“销售”,“前台”]
2、collect_set() 收集并形成set集合,结果去重
select sex, collect_set(job) from employee group by sex
结果:
女 [“行政”,“研发”,“前台”]
男 [“销售”,“研发”,“前台”]
1.4 炸裂函数(UDTF)
UDTF(Table-generating Functions),接受一行数据,输出一行或多行数据
1、数据准备
(1)表结构
movie | category |
《疑犯追踪》 | 悬疑,动作,科幻,剧情 |
《Lie to me》 | 悬疑,警匪,动作,心理,剧情 |
《战狼2》 | 战争,动作,灾难 |
(2)建表语句
create table movie_info( movie string, --电影名称 category string --电影分类 ) row format delimited fields terminated by "\t";
(3)输入数据
insert overwrite table movie_info values ("《疑犯追踪》", "悬疑,动作,科幻,剧情"), ("《Lie to me》", "悬疑,警匪,动作,心理,剧情"),("《战狼2》", "战争,动作,灾难");
2、需求
(1)根据上述电影信息表,统计各分类的电影数量,期望结果如下:
剧情 | 2 |
动作 | 3 |
心理 | 1 |
悬疑 | 2 |
战争 | 1 |
灾难 | 1 |
科幻 | 1 |
警匪 | 1 |
(2)代码实现
select cate count(*) from ( select movie,cate from ( select movie spilt(category,',') cates from movie_info ) t1 lateral view explode(cates) tmp as cate ) t2 group by cate;
1.5 窗口函数(开窗函数)
1.5.1 概述
窗口函数,能为每行数据划分一个窗口,然后对窗口范围内的数据进行计算,最后将计算结果返回给该行的数据。
1.5.2 常用窗口函数
按照功能,常用窗口可划分如下几类:聚合函数、跨行取值函数、排名函数。
1、聚合函数
max:最大值。
min:最小值。
sum:求和。
avg:平均值。
count:计数。
2、跨行取值函数
(1)lead和lag
获取当前行的上/下边某行、某个字段的值
注意:lead和lag函数不支持自定义窗口
(2)first_value和last_value
获取窗口内某一列的第一个值/最后一个值
3、排名函数
常用的排名函数–rank、dense_rank、row_number
功能:计算排名
1.6 自定义函数
1、hive自带了一些函数,比如:max/min等,但是数量有限,自己可以通过自定义UDF来方便扩展。
2、当Hive提供的内置函数无法满足你的业务处理需求时,此时就可以考虑使用用户自定义函数(UDF:user-defined function)。
3、根据用户自定义函数类别分为以下三种:
(1)UDF(User-Defined-Function)
一进一出
(2)UDAF(User-Defined Aggregation Function)
用户自定义聚合函数,多进一出
(3)UDTF(User-Defined table-Generating Functions)
用户自定义表生成函数,一进多出