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》       灾难
  1. 窗口函数
    窗口函数: 窗口+函数
    窗口: 函数运行时计算的数据集的范围
    函数: 运行的函数!
    格式: 函数 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常用函数的主要内容,如果未能解决你的问题,请参考以下文章

hive参数传递,hive常用函数

hive参数传递,hive常用函数

Hive 常用函数

Hive常用函数大全

Hive常用函数

Hive常用内置函数窗口函数及自定义函数