hive函数进阶总结

一、窗口函数与分析函数

通常在聚合函数后面加over函数限制窗口统计的规则及行数
语法:
over(partition by xxx order by xxx rows between xxx** and **xxx)

  • partition by :分组统计字段
  • order by:排序字典
  • window子句 :rows between 起点(默认是首行) and 终点(默认当前行)
    起点选择:
    n preceding:往前n条
    unbounded:起点
    unbounded preceding:从前面的起点开始
    终点选择:
    n following:往后n条
    current row:当前行
    unbounded following:表示到后面的终点结束

1、窗口排序函数

row_number() over():按顺序生成排序值,当排序 相同时,按表中记录值排序,不存在相同的排序值。
rank() over():排名相等会在名次中留下空位
dense_rank() over():排名相等会在名次中不会留下空位
hive函数进阶总结_第1张图片
2、窗口取上下值函数

lag (col,n,DEFAULT) over() :用于统计窗口内往上第n行值
lead (col,n,DEFAULT) over() : 用于统计窗口内往下第n行值
第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)

3、窗口内取第一个和最后一个值

first_value(col) over() : 取分组内排序后,截止到当前行,第一个值
last_value(col) over() : 取分组内排序后,截止到当前行,最后一个值

4、窗口聚合函数
sum(col) over()
max(col) over()
min(col) over()
avg(col) over()

二、lateral view 与 explode函数结合用法

explode就是将hive一行中复杂的array或者map结构拆分成多行。
lateral view与explode结合使用把结果组合,产生一个支持别名表的虚拟表。

select
tdbank_imp_date,
vgameappid,
platid,
zoneid,
vopenid,
id2[0] as SymbolID,
0 as iSpare
from
(
	select tdbank_imp_date,
	vgameappid,
	platid,
	zoneid,
	vopenid,
	split(id1,'\\+') as id2
	from
	(
		select tdbank_imp_date,
		vgameappid,platid,
		iZoneAreaID as zoneid,
		vopenid,
		SymbolInfo as id
		from 
		(
			select *,row_number() over(partition by vGameAppid,platid,iZoneAreaID,vopenid order by dtEventTime desc) as iOrder
			from tttt_ieg_tdbank::smoba_dsl_AcntInfoStock_fht0
		   where tdbank_imp_date >= date_sub('{:start_date}',29) and tdbank_imp_date < '{:end_date}' 
		) t
		where iOrder =1	
	) t1
	lateral view explode(split(id,',')) adTable as id1
)t2

三、字符串连接函数:concat、concat_ws,concat_group

1、CONCAT(str1,str2…)
用于多个字符串连接成一个字符串

2、CONCAT_WS(separator,str1,str2,…)
用于指定分隔符的字符串连接,第一个参数为分隔符

3、GROUP_CONCAT(DISTINCT col ORDER BY col_name ASC | DESC SEPARATOR str_val)
将分组中col 列值,按照分隔符合成一个字符串

select warehouse_id,order_id,
group_concat(distinct product_barcode order by product_barcode asc ) 组合
from order_product op
group by warehouse_id,order_id

结果:默认逗号分隔符
在这里插入图片描述

四、列转行函数:collect_list和collect_set

将分组中的某列转为一个数组返回,不同的是collect_list不去重而collect_set去重

select 
str_to_map(concat_ws(',',collect_set(concat(tagid,':',tagweight)))) as tagsmap

结果
在这里插入图片描述
用collect_set 实现上面GROUP_CONCAT函数功能:
CONCAT_WS(SEPARATOR ,collect_set(column))=GROUP_CONCAT(column)

五、with as用法

hive 可以通过with查询来提高查询性能,因为先通过with语法将数据查询到内存(相当于临时表),然后后面其它查询可以直接使用。

WITH t1 AS (
        SELECT order_code
        FROM orders
        where order_status=1
    ), 
    t2 AS (
        SELECT order_code,order_time
        FROM order_time
    )
SELECT *
FROM t1, t2
注意:这里必须要整体作为一条sql查询,即with as语句后不能加分号,不然会报错。

六、TRANSFORM USING as 用法

transform(字段1,字段2) using ‘脚本名’ as(字段1,字段2)


FROM (
	FROM pv_users
	SELECT TRANSFORM(pv_users.userid, pv_users.date)
	USING 'map_script'
	AS dt, uid
	CLUSTER BY dt
) map_output
INSERT OVERWRITE TABLE pv_users_reduced
SELECT TRANSFORM(map_output.dt, map_output.uid)
USING 'reduce_script'

你可能感兴趣的:(hive函数进阶总结)