zoukankan      html  css  js  c++  java
  • hive的窗口函数cume_dist、fercent_rank

    一、cume_dist

    这两个序列分析函数不是很常用,这里也介绍一下。
    注意: 序列函数不支持WINDOW子句。

    数据准备:

    d1,user1,1000
    d1,user2,2000
    d1,user3,3000
    d2,user4,4000
    d2,user5,5000

    创建表并加载数据

    create external table user(
    dept string,
    userid string,
    sal int
    )
    row format delimited 
    fields terminated by ','
    stored as textfile 
    location '/testuser';

    验证数据:

    hive (default)> select * from user;
    OK
    user.dept    user.userid    user.sal
    d1    user1    1000
    d1    user2    2000
    d1    user3    3000
    d2    user4    4000
    d2    user5    5000
    Time taken: 0.341 seconds, Fetched: 5 row(s)

    CUME_DIST
    –CUME_DIST 小于等于当前值的行数/分组内总行数
    –比如,统计小于等于当前薪水的人数,所占总人数的比例

    select dept,userid,sal,
    cume_dist() over(order by sal) as rn1,
    cume_dist() over(partition by dept order by sal) as rn2
    from user;
    
    OK
    dept    userid    sal    rn1    rn2
    d1    user1    1000    0.2    0.3333333333333333
    d1    user2    2000    0.4    0.6666666666666666
    d1    user3    3000    0.6    1.0
    d2    user4    4000    0.8    0.5
    d2    user5    5000    1.0    1.0
    Time taken: 3.931 seconds, Fetched: 5 row(s)

    rn1: 没有partition,所有数据均为1组,总行数为5,
    第一行:小于等于1000的行数为1,因此,1/5=0.2
    第三行:小于等于3000的行数为3,因此,3/5=0.6
    rn2: 按照部门分组,dpet=d1的行数为3,
    第二行:小于等于2000的行数为2,因此,2/3=0.6666666666666666

    二、percent_rank

    –PERCENT_RANK 分组内当前行的RANK值-1/分组内总行数-1
    应用场景不了解,可能在一些特殊算法的实现中可以用到吧。–PERCENT_RANK 分组内当前行的RANK值-1/分组内总行数-1
    应用场景不了解,可能在一些特殊算法的实现中可以用到吧。

    SELECT 
    dept,
    userid,
    sal,
    PERCENT_RANK() OVER(ORDER BY sal) AS rn1,   --分组内
    RANK() OVER(ORDER BY sal) AS rn11,          --分组内RANK值
    SUM(1) OVER(PARTITION BY NULL) AS rn12,     --分组内总行数
    PERCENT_RANK() OVER(PARTITION BY dept ORDER BY sal) AS rn2 
    FROM user;
     
    dept    userid   sal    rn1    rn11     rn12    rn2
    d1      user1   1000    0.0     1       5       0.0
    d1      user2   2000    0.25    2       5       0.5
    d1      user3   3000    0.5     3       5       1.0
    d2      user4   4000    0.75    4       5       0.0
    d2      user5   5000    1.0     5       5       1.0
     

    rn1: rn1 = (rn11-1) / (rn12-1)
    第一行,(1-1)/(5-1)=0/4=0
    第二行,(2-1)/(5-1)=1/4=0.25
    第四行,(4-1)/(5-1)=3/4=0.75
    rn2: 按照dept分组,
    dept=d1的总行数为3
    第一行,(1-1)/(3-1)=0
    第三行,(3-1)/(3-1)=1

  • 相关阅读:
    拦截器getmodel方法什么时候被调用(没搞懂有什么鸟用,自己搭的项目中用到了这个)
    Convention插件的使用(会涉及content目录,jsp必须放入这个下面才能映射成功基于注解的配置)
    Spring组件扫描<context:component-scan/>使用详解
    Eclipse从数据库逆向生成Hibernate带注解的实体类
    HibernateTool的安装和使用(Eclipse中)
    将一字符串首字母转大写
    二分(折半)查找算法
    按位与运算符
    注解及自定义注解
    根据前序遍历和中序遍历得出后序遍历
  • 原文地址:https://www.cnblogs.com/dongdone/p/5737760.html
Copyright © 2011-2022 走看看