hive中的常用窗口函数

开窗函数

关键字 over()
格式:函数名(列名) over(partition by 列名 order by 列名)

排序相关的开窗函数

1、row_number() over():对相等的值不进行区分,会依次进行排序。
2、rank() over():会跳着排序,即相等的值排名一样,然后跳过下一名,如:两个第一名,接下来的一个就是第三名
3、dense_rank() over():不会跳序排列,即相等的值排名一样,然后是下一名,如:两个第一名,接下来的一个就是第二名

NTILK

NTILK(n),用于将分组数据按照顺序切分成n片,返回当前切片值。
注:如果切片值不均匀,默认增加到第一个切片的分布。

SELECT cookieid,createtime,pv,
NTILE(2) OVER(PARTITION BY cookieid ORDER BY createtime) AS ntile1,    --分组内将数据分成2片
NTILE(3) OVER(PARTITION BY cookieid ORDER BY createtime) AS ntile2,  --分组内将数据分成3片
NTILE(4) OVER(PARTITION BY cookieid ORDER BY createtime) AS ntile3   --将所有数据分成4片
FROM test1 

hive中的常用窗口函数_第1张图片
用法举例
统计一个cookie,pv数最多的1/3的天

SELECT cookieid,createtime,pv,
NTILE(3) OVER(PARTITION BY cookieid ORDER BY pv DESC) AS ntile 
FROM test1;

取出ntile=1的记录,就是结果

CUME_DIST函数

cume_dist返回小于等于当前值的行数/分组内总行数
实战:统计小于等于当前心水的人数,所占总人数的比列

SELECT cookieid,createtime,pv,
round(CUME_DIST() OVER(ORDER BY pv),2) AS cd1,
round(CUME_DIST() OVER(PARTITION BY cookieid ORDER BY pv),2) AS cd2  
FROM test1;

注:round函数是让结果精确到几位

hive中的常用窗口函数_第2张图片

LAG 和 LEAD 函数

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

SELECT cookieid,createtime,pv,
ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn,
LAG(createtime,1,'1970-01-01') OVER(PARTITION BY cookieid ORDER BY createtime) AS lag1,
LAG(createtime,2) OVER(PARTITION BY cookieid ORDER BY createtime) AS lag2 
FROM test1;

hive中的常用窗口函数_第3张图片
LEAD 函数则与 LAG 相反:

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

FIRST_VALUE 和 LAST_VALUE 函数

FIRST_VALUE 取分组内排序后,截止到当前行,第一个值

SELECT cookieid,createtime,pv,
ROW_NUMBER() OVER(PARTITION BY cookieid ORDER BY createtime) AS rn,
FIRST_VALUE(pv) OVER(PARTITION BY cookieid ORDER BY createtime) AS first  
FROM test1;

hive中的常用窗口函数_第4张图片
LAST_VALUE 函数则相反:

LAST_VALUE 取分组内排序后,截止到当前行,最后一个值
这两个函数还是经常用到的(往往和排序配合使用),比较实用!

你可能感兴趣的:(大数据hive)