Hive分析窗口函數之CUME_DIST和PERCENT_RANK


兩個序列分析函數不是很常用,這里也介紹一下。


環境信息:
Hive版本為apache-hive-0.14.0-bin
Hadoop版本為hadoop-2.6.0
Tez版本為tez-0.7.0


1. CUME_DIST 小於等於當前值的行數/分組內總行數

創建表:

create table windows_dept

(

    deptno string,

    pno string,

    sum_insured decimal(18,2)

)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY ','

stored as textfile;

 

數據:

G01,P001,10

G01,P002,20

G01,P003,30

G02,P004,40

G02,P005,50

G03,P006,60

G03,P007,70

G03,P008,80

G03,P009,90

G03,P010,100

加載數據到Hive表中:

LOAD DATA LOCAL INPATH  '/home/hadoop/testhivedata/dept.txt'  OVERWRITE INTO TABLE windows_dept;

 

測試:

SELECT

    deptno,

    pno,

    sum_insured,

    CUME_DIST() OVER(ORDER BY sum_insured) AS rn1,

    CUME_DIST() OVER(PARTITION BY deptno ORDERBY sum_insured) AS rn2

FROM windows_dept;

結果:

deptno     pno         sum_insured     rn1   rn2

G01           P001      10          0.1  0.3333333333333333

G01     P002      20          0.2  0.6666666666666666

G01     P003      30          0.3  1.0

G02     P004      40          0.4  0.5

G02     P005      50          0.5  1.0

G03     P006      60          0.6  0.2

G03     P007      70          0.7  0.4

G03     P008      80          0.8  0.6

G03     P009      90          0.9  0.8

G03     P010      100        1.0  1.0

分析:

rn1: 沒有partition,所有數據均為1組,總行數為10,

    第1行:小於等於10的行數為1,因此,1/10=0.1

    第5行:小於等於50的行數為5,因此,5/10=0.5

rn2: 按照部門分組,deptno=G03的行數為5,

    第6行:小於等於60的行數為1,因此,1/5=0.2

第8行:小於等於80的行數為3,因此,3/5=0.6

 

 

2. PERCENT_RANK 分組內當前行的RANK-1/分組內總行數-1


SELECT

   deptno,

   pno,

   sum_insured,

   PERCENT_RANK() OVER(ORDER BY sum_insured) AS rn1, --分組內

   RANK() OVER(ORDER BY sum_insured) AS rn11, --分組內RANK

   SUM(1) OVER(PARTITION BY NULL) AS rn12, --分組內總行數

   PERCENT_RANK() OVER(PARTITION BY deptno ORDER BY sum_insured) AS rn2

FROM windows_dept;

結果:

deptno        pno   sum_insured  rn1                                         rn11          rn12      rn2

G01      P001 10           0.0                                           1        10         0.0

G01      P002 20           0.1111111111111111      2        10         0.5

G01      P003 30           0.2222222222222222      3        10         1.0

G02      P004 40           0.3333333333333333      4        10         0.0

G02      P005 50           0.4444444444444444      5        10         1.0

G03      P006 60           0.5555555555555556      6        10         0.0

G03      P007 70           0.6666666666666666      7        10         0.25

G03      P008 80           0.7777777777777778      8        10         0.5

G03      P009 90           0.8888888888888888      9        10         0.75

G03      P010 100         1.0                                            10     10         1.0

 

分析:

rn1: rn1 =(rn11-1) / (rn12-1)

    第一行,(1-1)/(10-1)=0/9=0

    第二行,(2-1)/(10-1)=1/9=0.1111111111111111

    第四行,(4-1)/(10-1)=3/4=0.3333333333333333

rn2: 按照deptno分組,deptno=G01的總行數為3

    第一行,(1-1)/(3-1)=0

    第二行,(2-1)/(3-1)=0.5

    第三行,(3-1)/(3-1)=1


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com