hive常用函数
Posted 海绵不老
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hive常用函数相关的知识,希望对你有一定的参考价值。
hive常用函数
函数分类
①UDF: 用户定义的函数。 一进一出。 输入单个参数,返回单个结果!
②UDTF: 用户定义的表生成函数。 一进多出。传入一个参数(集合类型),返回一个结果集!
③UDAF: 用户定义的聚集函数。 多进一出。 传入一列多行的数据,返回一个结果(一列一行)
系统内置函数
1.查看系统自带的函数
hive> show functions;
2.显示自带的函数的用法
hive> desc function upper;
3.详细显示自带的函数的用法
hive> desc function extended upper;
常用查询函数
1.NVL:
给值为NULL的数据赋值,它的格式是NVL( string1, replace_with)。
它的功能是如果string1为NULL,则NVL函数返回replace_with 的值,
否则返回string1的值,如果两个参数都为NULL ,则返回NULL。
2.CASE WHEN:
case sex when '男' then 1 else 0 end
case sex when '女' then 1 else 0 end
3.行转列
CONCAT(string A/col, string B/col…):
返回输入字符串连接后的结果,支持任意个输入字符串;
CONCAT_WS(separator, str1, str2,…):
它是一个特殊形式的 CONCAT()。第一个参数剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值 也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;
COLLECT_SET(col):
函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。
COLLECT_LIST(col):
函数只接受基本数据类型,它的主要作用是将某字段的值进行不去重汇总,产生array类型字段。
select concat_ws('|',COLLECT_list(name)),cb from
(select name,CONCAT(constellation,',',blood_type) cb from person_info) a group by a.cb;
大海|凤姐 射手座,A
孙悟空|猪八戒 白羊座,A
宋宋 白羊座,B
4.列转行
1.函数说明
EXPLODE(col):
将hive一列中复杂的array或者map结构拆分成多行。
LATERAL VIEW:
用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias
解释:用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。
eg:
《疑犯追踪》 ["悬疑","动作","科幻","剧情"]
《Lie to me》 ["悬疑","警匪","动作","心理","剧情"]
《战狼2》 ["战争","动作","灾难"]
select a.movie,tmp.categoryName from movie_info a
lateral view explode(category) tmp AS categoryName;
《疑犯追踪》 悬疑
《疑犯追踪》 动作
《疑犯追踪》 科幻
《疑犯追踪》 剧情
《Lie to me》 悬疑
《Lie to me》 警匪
《Lie to me》 动作
《Lie to me》 心理
《Lie to me》 剧情
《战狼2》 战争
《战狼2》 动作
《战狼2》 灾难
-
窗口函数
窗口函数: 窗口+函数
窗口: 函数运行时计算的数据集的范围
函数: 运行的函数!
格式: 函数 over( partition by 字段 ,order by 字段 window_clause )
仅仅支持以下函数:
Windowing functions:
LEAD:
LEAD (scalar_expression [,offset] [,default]): 返回当前行以下N行的指定列的列值!
如果找不到,就采用默认值
LAG:
LAG (scalar_expression [,offset] [,default]): 返回当前行以上N行的指定列的列值!
如果找不到,就采用默认值
FIRST_VALUE:
FIRST_VALUE(列名,[false(默认)]): 返回当前窗口指定列的第一个值,
第二个参数如果为true,代表加入第一个值为null,跳过空值,继续寻找!
LAST_VALUE:
LAST_VALUE(列名,[false(默认)]): 返回当前窗口指定列的最后一个值,
第二个参数如果为true,代表加入第一个值为null,跳过空值,继续寻找!
统计类的函数(一般都需要结合over使用): min,max,avg,sum,count
排名分析:
RANK 排序相同时会重复,总数不会变
ROW_NUMBER会根据顺序计算
DENSE_RANK排序相同时会重复,总数会减少
CUME_DIST
PERCENT_RANK
NTILE注意:不是所有的函数在运行都是可以通过改变窗口的大小,来控制计算的数据集的范围! 所有的排名函数和LAG,LEAD,支持使用over(),但是在over()中不能定义 window_clause 窗口的大小可以通过windows_clause来指定: (rows | range) between (unbounded | [num]) preceding and ([num] preceding | current row | (unbounded | [num]) following) (rows | range) between current row and (current row | (unbounded | [num]) following) (rows | range) between [num] following and (unbounded | [num]) following 特殊情况: ①在over()中既没有出现windows_clause,也没有出现order by,窗口默认为rows between UNBOUNDED PRECEDING and UNBOUNDED FOLLOWING ②在over()中(没有出现windows_clause),指定了order by,窗口默认为rows between UNBOUNDED PRECEDING and CURRENT ROW 窗口函数和分组有什么区别? ①如果是分组操作,select后只能写分组后的字段 ②如果是窗口函数,窗口函数是在指定的窗口内,对每条记录都执行一次函数 ③如果是分组操作,有去重效果,而partition不去重!
eg:
jack,2017-01-01,10
tony,2017-01-02,15
jack,2017-02-03,23
tony,2017-01-04,29
jack,2017-01-05,46
jack,2017-04-06,42
tony,2017-01-07,50
jack,2017-01-08,55
mart,2017-04-08,62
mart,2017-04-09,68
neil,2017-05-10,12
mart,2017-04-11,75
neil,2017-06-12,80
mart,2017-04-13,94
(1)查询在2017年4月份购买过的顾客及总人数
select name,count(*) over ()
from business
where substring(orderdate,1,7) = '2017-04'
group by name;
(2)查询顾客的购买明细及月购买总额
select name,orderdate,cost,sum(cost) over(partition by month(orderdate)) from
business;
(3)查询顾客的购买明细要将cost按照日期进行累加
select name,orderdate,cost,sum(cost) over(partition by name order by orderdate )
from business
(4)查询顾客的购买明细及顾客上次的购买时间
select name,orderdate,cost,lag(orderdate,1,'无数据') over(partition by name order by orderdate )
from business
( 5) 查询顾客的购买明细及顾客下次的购买时间
select name,orderdate,cost,lead(orderdate,1,'无数据') over(partition by name order by orderdate )
from business
(6)查询顾客的购买明细及顾客本月第一次购买的时间
select name,orderdate,cost,FIRST_VALUE(orderdate,true) over(partition by name,substring(orderdate,1,7) order by orderdate )
from business
(7)查询顾客的购买明细及顾客本月最后一次购买的时间
select name,orderdate,cost,LAST_VALUE(orderdate,true) over(partition by name,substring(orderdate,1,7) order by orderdate rows between CURRENT row and UNBOUNDED FOLLOWING)
from business
(8)查询顾客的购买明细及顾客最近三次cost花费
最近三次: 当前和之前两次 或 当前+前一次+后一次
当前和之前两次:
select name,orderdate,cost,sum(cost) over(partition by name order by orderdate rows between 2 PRECEDING and CURRENT row)
from business
当前+前一次+后一次:
select name,orderdate,cost,sum(cost) over(partition by name order by orderdate rows between 1 PRECEDING and 1 FOLLOWING)
from business
或
select name,orderdate,cost,cost+
lag(cost,1,0) over(partition by name order by orderdate )+
lead(cost,1,0) over(partition by name order by orderdate )
from business
(9)查询前20%时间的订单信息
精确算法:
select *
from
(select name,orderdate,cost,cume_dist() over(order by orderdate ) cdnum
from business) tmp
where cdnum<=0.2
不精确计算:
select *
from
(select name,orderdate,cost,ntile(5) over(order by orderdate ) cdnum
from business) tmp
where cdnum=1
以上是关于hive常用函数的主要内容,如果未能解决你的问题,请参考以下文章