hive中函数的简单简绍
hive中的函数大致分为三种:UDF、UDTF、UDAF UDF:是一进一出的 UDAF:多进一出 UDTF:一进多出 注意:这个一指的是行数
系统内置函数
查看系统内置函数: show functions;
显示自带函数的使用方法: desc function upper;
详细显示系统自带函数的使用方法: desc function ectended upper'
空字段赋值函数(NVL)
select comm, nvl( comm, - 1 ) from emp;
CASE WHEN THEN ELSE ENG
数据准备
需求
select
dpt,
sum ( case gender when '男' then 1 else 0 end ) male,
sum ( case gender when '女' then 1 else 0 end ) female
from
emp
group by
dpt;
select
dpt,
sum ( if ( sex= '男' , 1 , 0 ) ) male,
sum ( if ( sex= '女' , 1 , 0 ) ) female
from
emp
group by
dpt;
行转列(concat、concat_ws、collect_set、collect_list)
concat
select concat( 'hello' , '-' , 'world' ) ;
select concat( id, '-' , name) from emp;
concat_ws
当拼接符号一样的时候可以使用concat_ws,但是他只可以拼接string类型的 这个还可以放数组,将数组里的元素使用第一个符号拼接
select concat_ws( '-' , 'hello' , 'world' , 'china' ) ;
select concat_ws( '-' , id, name) from emp;
collect_set
collect_set函数只接受基本数据类型,他是将字段的值进行去重,返回的是一个数组 collect_list函数显示出所有的元素,返回的是一个数组
select collect_set( col) from emp;
练习
需求
name coll blood 孙悟空 白羊 A 大海 射手 A 松松 白羊 B 八戒 白羊 A 沙僧 射手 A
select
type , concat_ws( '|' , collect_set( name) )
from ( select concat( coll, ',' , blood) as type , name from nametype) a
group by type ;
列转行函数(explode)
功能简绍
explode(col):将hive一列中复杂的Array或者Map结构拆分成多行 lateral view:他能将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合
实例
电影名 类型 《疑犯追踪》 [“悬疑”,“科幻”,“动作”,“剧情”] 《LIE TO ME》 [“悬疑”,“警匪”,“动作”,“心理”,“剧情”] 《战狼2》 [“战争”,“动作”,“灾难”]
select name, type_name from filetype lateral view explode ( type ) table_tmp as type_name;
name type_name 《疑犯追踪》 悬疑 《疑犯追踪》 科幻 《疑犯追踪》 动作 《疑犯追踪》 剧情 《LIE TO ME》 悬疑 《LIE TO ME》 警匪 《LIE TO ME》 动作 《LIE TO ME》 心理 《LIE TO ME》 剧情 《战狼2》 战争 《战狼2》 动作 《战狼2》 灾难
窗口函数(开窗函数)
相关函数说明
over():指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变 CURRENT ROW:当前行 n PRECEDING:往前n行数据 n FOLLOWING:往后n行数据 UNBOUNDED:起点,UNBOUNDED PRECEDING 表示从前面的起点 UNBOUNDED FOLLOWING表示到后面终点 LAG(col,n) 往前第n行数据 LEAD(col,n) 往后第n行 NTILE 把有序分区中的行分发到指定数据的组中,每个组有编号,编号从1开始
练习
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 Tony 2017-04-06 42 Jack 2017-01-07 50 Mark 2017-01-08 55 Mark 2017-04-09 62 Neil 2017-04-10 68 Mark 2017-05-11 12 Neil 2017-06-12 75
需求
select name, count ( * ) over ( ) from goods where substring( orderdate, 6 , 2 ) = '04' ;
select * , sum ( cost) over ( rows between unbounded preceding and current row ) from goods;
select * , sum ( cost) over ( partition by name order by orderdate) from goods;
select name, orderdate, cost, lag( orderdate, 1 ) over ( distribute by name sort by orderdate) from goods;
select name, orderdate, cost from
( select name, orderdate, cost, ntile( 5 ) over ( order by orderdate) ntile_5 from goods) t
where ntile_5= 1 ;
Rank
函数说明
rank():相同的在一个名次,但是总数不变 dense_rank():这个相同的在同一个名次,还是连续 row_number():相同的不在一个每次
其他常用函数
时间函数
select unix_timestamp( ) ;
select unix_timestamp( '2020-11-30' , 'yyyy-MM-dd' ) ;
select from_unixtime( 1606694400 ) ;
select from_unixtime( 1606694400 , 'yyyy-MM' ) ;
select current_date ;
select current_timestamp ;
select to_date( '2020-02-01 12:12:12' ) ;
select year ( '2020-02-01 12:12:12' ) ;
select weekofyear( '2020-11-30' ) ;
select weekofmonth( '2020-11-30' ) ;
select months_between( '2020-04-01' , '2020-10-01' ) ;
select add_months( '2020-11-30' , 3 ) ;
select add_months( '2020-11-30' , - 3 ) ;
select datediff( '2020-04-01' , '2020-10-01' ) ;
select date_add( '2020-11-30' , 4 ) ;
select date_add( '2020-11-30' , - 4 ) ;
select last_day( '2020-02-28' ) ;
select date_format( '2020-11-30 12:00:01' , 'yyyy/MM/dd HH mm ss' ) ;
取整函数
select round ( 3.24 ) ;
select ceil( 3.14 ) ;
select floor( 3.14 ) ;
字符串函数
select upper( 'low' ) ;
select lower( 'LOW' ) ;
select length( '123' ) ;
select trim( ' aa ' ) ;
select regexp_replace( '2020/01/01' , '/' , '-' ) ;
集合函数
select size( a) ;
select map_keys( a) ;
select map_values( a) ;
select array_contains( a, 'a' ) ;
select sort_array( a) ;