[Hive_10] Hive 的分析函数

本文深入探讨了Hive中的窗口函数应用,包括over函数的使用方法,如何通过它定义窗口界限进行数据聚合;介绍了三种排名函数(rank, dense_rank, row_number)的特性与应用场景;解析了最大值函数first_value的工作原理;演示了如何利用ntile函数进行数据分层;并详细解释了lead和lag函数在统计连续活跃用户中的作用,最后展示了cume_dist函数计算指定值占总数百分比的方法。

0. 说明

  Hive 的分析函数 窗口函数  | 排名函数 | 最大值 | 分层次 | lead && lag 统计活跃用户 | cume_dist

 

 

 

 


1. 窗口函数(开窗函数) over

  1.1 说明

  1 preceding  //前一个
  1 following  //后一个
  current row  //当前行
  unbounded preceding  //无上限
  unbounded following  //无下限

  1.2 测试

# 以行定义窗口界限
select id, name, age , sum(age)over(order by id rows between current row and 2 following) from user_par;

# 以值定义窗口界限
select id, name, age , sum(age)over(order by age range between current row and 10 following) from user_par;

 


 

2. 排名函数

  2.1 并列跳跃

  113
  rank

select id, name, province, age , rank()over(partition by province order by age desc) from user_par;

 

  2.2 不跳跃

  112
  dense_rank

select id, name, province, age , dense_rank()over(partition by province order by age desc) from user_par;

 

  2.3 顺序

  123
  row_number

select id, name, province, age , row_number()over(partition by province order by age desc) from user_par;

 


3. 最大值

  first_value()

select id, name, province, age , first_value()over(partition by province order by age desc) from user_par;

 


 

4. 分层次

  按照三六九等进行平均分层

  ntile()

select id, name, age , ntile(3)over(order by age desc) from user_par;

 



5. lead && lag

  5.1 lead()

  将列向上提

select id, name, province, age , lead(age)over(partition by province order by age asc) from user_par;

 

  5.2 lag()

  将列向下沉

select id, name, province, age , lag(age)over(partition by province order by age asc) from user_par;

 

  5.3 统计连续活跃

  1. 准备数据

  

 

  2. 建表

create table active(id string, month int) 
row format delimited
fields terminated by '\t';

 

  3. 加载数据

load data local inpath '/home/centos/files/active.txt' into  table active;

 

  4. 统计连续两月活跃用户

select id from (select id, month, lead(month)over(partition by id order by month desc) as month2 from active)a where month=month2+1;

 


 

6. cume_dist()

  指定值占总数的百分比

 

  Demo

select id,name,age, cume_dist()over(order by age desc) from user_nopar;

   

 

 


 

转载于:https://www.cnblogs.com/share23/p/10298373.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值