hive难以记住的函数

1,125 阅读5分钟

一、总结hive难以记住的函数

1、聚合函数

avg(col)					#返回改组的平均值
count(col)					#返回检索的行数
max(col)					#返回该组的最大值
min(col)					#返回该组的最小值
collect_set(col)			#返回一组消除重复元素的对象,可与concat_ws、explode连用,collect_set表示去重复,collect_set表示不去重复。**用于多行转单行**
collect_set的example(只接受基本的数据类型):
	select c1,collect_set(c2)[0]
    from aa
    group by c1
输出:
    c1 c2 
    a  ["1","2","3"]
    b  ["4","5","6"]
与concat_ws连用example:
	select c1,concat_ws(",",collect_set(c2))
    from aa
    group by c1
输出类型:
    c1 c2 
    a  1,2,3
    b  4,5,6	

2、explode函数

explode(array)					#参数为数组类型,将数组每个数据作为1行返回
explode(map)					#参数为map类型,将map中每个键值对,转化为两列返回新行
posexplode(array)				#与explode(array)类似,但包含元素在数组中的位置(pos,value)
lateral view					#LATERAL VIEW udtf表达式 tableAlias AS columnAlias。与udtf连用


数据示例:
表明aa
	id  col 
    1   [{"v1":"1","v2":"2"},{"v3":"3","v4":"4"}]
    2   [{"v5":"5","v6":"6"},{"v7":"7","v8":"8"}]
    3   null
explode的example:
	select explode(col)
    from aa
输出:
	{"v1":"1","v2":"2"}
    {"v3":"3","v4":"4"}
    {"v5":"5","v6":"6"}
    {"v7":"7","v8":"8"}
    
    
lateral view ecplode的example:
	select id,col1
    from aa 
	lateral view ecplode(col) col as col1 
输出:
	1	{"v1":"1","v2":"2"}
    1	{"v1":"3","v2":"4"}
    2	{"v1":"5","v2":"6"}
    2	{"v1":"7","v2":"8"}
lateral view ecplode的example解析array并获取map中的值:
	select id,col1['v1']
    from aa 
	lateral view ecplode(col) col as col1 
输出:
	1	1
    1	3
    2	5
    2	7
    
    
    
lateral view ecplode的example解析array并解析map中的值:
	select id,ecplode(col1)
    from aa 
	lateral view ecplode(col) col as col1 
输出:
	1	v1	1
    1	v2	2
    1	v1	3
    1	v2	4
    2	v1	5
    2	v2	6
    2	v1	7
    2	v2	8
lateral VIEW outer explode 保留原始null值,将扩展列的null置为null  



数据示例:
mhotel          pois 
90663029        [{"search": 5, "id": 15306667, "poi": "巫山县教委关心下一代工作委员会"}, {"search": 2, "id": 15381967, "poi": "文体广场"}, {"search": 1, "id": 15433199, "poi": "巫
山翠屏汽车站"}]
90808282        [{"search": 9, "id": 15451636, "poi": "巫山县教育委员会"}, {"search": 5, "id": 15306667, "poi": "巫山县教委关心下一代工作委员会"}, {"search": 1, "id": 15367082, "poi": "南峰小学"}]
sql例子:
	SELECT
      mhotel,
      json_tuple(poi_json,'search','id','poi') AS (search,id,poi)
    FROM
      (SELECT
         mhotel,
         regexp_replace(regexp_replace(pois, '\\[|\\]', ''), '\\}, \\{', '\\}&\\{') pois
       FROM iii) t
      lateral VIEW explode(split(pois, '\\&')) pois AS poi_json

3、json字符串解析

get_josn_object					#用来解析json的一个字段
json_tuple						#用来解析json的多个字段
get_josn_object的example:
	select get_josn_object(a,'$.type') as type,get_josn_object(a,'$.name') as name
    from aa 
json_tuple的example:
	select a.id,b.name,b.type
    from aa a
    lateral view json_tuple(first,'name','type') b as name,type

4、时间函数

unix_timestamp(date)								# 将日期转化成时间戳
from_unixtime(unixtime,format)						#将时间戳转化成日期
from_timestamp(unix_timestamp(),’yyyy-MM-dd HH:mm:ss’)#获取当前日期
current_date										#当前日期
current_timestamp()									#当前日期精确到毫秒
date_add(DATE startdate,int days)					#日期加
date_sub(DATE startdate,int days)					#日期减
date_diff(DATE startdate,DATE enddate)				#日期差,前面日期大返回正数
add_months(DATE|STRING|TIMESTAMP start_date, int num)	#返回start_date的num天,若日期为2020-08-31,num为3则返回2020-11-30
year(stirng date)									#返回日期的year部分
month(stirng date)									#返回日期的month部分
day(stirng date)									#返回日期的day部分
hour(stirng date)									#返回日期的hour部分
dayofmonth(string date)								#返回该月有多少天
last_day(string date)								#返回所属月的最后一天
months_between(DATE|TIMESTAMP|STRING date1, DATE|TIMESTAMP|STRING date2)
#返回两个日期之间的月份,不是同一天则按照31计算天数,并按照小数点后8位4舍5入
next_day(STRING start_date, STRING day_of_week)		#例如:next_day('2020-03-31','Monday') = 2020-04-06;及返回下周的的周一
quarter(DATE|TIMESTAMP|STRING a)					#获取时间在一年的季度
weekofyear(STRING date)								#获取日期在一年的周数
to_date(STRING timestamp)							#返回时间的日期部分

5、数学函数

abs(double a)										#a的绝对值
ceil(double a)										#返回等于或大于a的最小的intfloor(double a)										#返回等于或小于a的最小的intrand(int seed)										#返回一个从01均匀分布的随机数,指定种子数字确定
round(double a,int d)							   #返回四舍五入的BIGINT值a或a的四舍五入到d位小数

6、窗口函数

1、聚合型窗口函数 SUM(), MIN(),MAX(),AVG(),COUNT()这些常见的聚合函数配合窗口函数使用,rows between 3 preceding and current row可以定义窗口的范围,count(distinct xxx)在窗口函数里是不允许使用的,也可以用size(collect_set() over(partition by order by))来替代实现我们的需求。

例子:
	select *, sum(result) over (partition by name order by time rows between 3 preceding and current row) as result
	FROM aa;

2、分析性聚合函数 RANk(),ROW_NUMBER(),DENSE_RANK()等常见的排序用的窗口函数。区别:ow_number函数:生成连续的序号(相同元素序号相同); rank函数:如两元素排序相同则序号相同,并且会跳过下一个序号; * rank函数:如两元素排序相同则序号相同,不会跳过下一个序号;还有 CUME_DIST函数 :小于等于当前值的行在所有行中的占比 PERCENT_RANK() :小于当前值的行在所有行中的占比 * NTILE() :如果把数据按行数分为n份,那么该行所属的份数是第几份

3、取值型窗口函数 LAG是迟滞的意思,也就是对某一列进行往后错行;LEAD是LAG的反义词,也就是对某一列进行提前几行;FIRST_VALUE是对该列到目前为止的首个值,而LAST_VALUE是到目前行为止的最后一个值。 LAG()和LEAD() 可以带3个参数,第一个是返回的值,第二个是前置或者后置的行数,第三个是默认值。

7、条件函数

assert_true(boolean condition)					#如果成立返回null,不成立抛出异常
coalesce(T v1, T v2, ...)						#返回参数第一个非null表达式
if(boolean condation, T valueTrue, T valuefalse)#true返回valueTrue,false返回valuefalse	
isnotnull(a)									#不为null返回true,否则反之
isnull(a)										#不为null返回false,否则反之
nullif(a, b)									#a=b返回null,否则返回一个
nvl(T value, T default_value)					#返回默认值,如果值为空,否则返回值

借鉴:juejin.cn/post/684490…