Hive分析窗體函數之NTILE,ROW_NUMBER,RANK和DENSE_RANK
繼續介紹幾個序列函數:
NTILE。ROW_NUMBER,RANK和DENSE_RANK
環境信息:
Hive版本號為apache-hive-0.14.0-bin
Hadoop版本號為hadoop-2.6.0
Tez版本號為tez-0.7.0
數據:
P088888888888,2016-02-10,1
P088888888888,2016-02-11,3
P088888888888,2016-02-12,1
P088888888888,2016-02-13,9
P088888888888,2016-02-14,3
P088888888888,2016-02-15,12
P088888888888,2016-02-16,3
P066666666666,2016-02-10,6
P066666666666,2016-02-11,2
P066666666666,2016-02-12,1
P066666666666,2016-02-13,9
P066666666666,2016-02-14,2
P066666666666,2016-02-15,20
P066666666666,2016-02-16,2
導入數據到Hive表中:
load data local inpath ‘/home/hadoop/testhivedata/windows_func.txt‘ overwrite into table windows_func;
NTILE
NTILE(n)。用於將分組數據依照順序切分成n片。返回當前切片值
NTILE不支持ROWS BETWEEN,比方 NTILE(2) OVER(PARTITION BY polno ORDER BY createtime ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)
假設切片不均勻。默認添加第一個切片的分布。
SELECT
polno,
createtime,
pnum,
NTILE(2) OVER(PARTITION BY polno ORDER BY createtime) AS rn1, --分組內將數據分成2片
NTILE(3) OVER(PARTITION BY polno ORDER BY createtime) AS rn2, --分組內將數據分成3片
NTILE(4) OVER(ORDER BY createtime) AS rn3 --將全部數據分成4片
FROM windows_func ORDER BY polno,createtime;
結果:
polno createtime pnum rn1 rn2 rn3
P066666666666 2016-02-10 6 1 1 1
P066666666666 2016-02-11 2 1 1 1
P066666666666 2016-02-12 1 1 1 2
P066666666666 2016-02-13 9 1 2 2
P066666666666 2016-02-14 2 2 2 3
P066666666666 2016-02-15 20 2 3 3
P066666666666 2016-02-16 2 2 3 4
P088888888888 2016-02-10 1 1 1 1
P088888888888 2016-02-11 3 1 1 1
P088888888888 2016-02-12 1 1 1 2
P088888888888 2016-02-13 9 1 2 2
P088888888888 2016-02-14 3 2 2 3
P088888888888 2016-02-15 12 2 3 4
P088888888888 2016-02-16 3 2 3 4
--比方,pnum數最多的前1/3的天
--rn = 1 的記錄,就是我們想要的結果
SELECT polno,
createtime,
pnum,
NTILE(3) OVER(PARTITION BY polno ORDER BY pnum DESC) AS rn
FROM windows_func;
結果:
polno createtime pnum rn
P066666666666 2016-02-15 20 1
P066666666666 2016-02-13 9 1
P066666666666 2016-02-10 6 1
P066666666666 2016-02-16 2 2
P066666666666 2016-02-11 2 2
P066666666666 2016-02-14 2 3
P066666666666 2016-02-12 1 3
P088888888888 2016-02-15 12 1
P088888888888 2016-02-13 9 1
P088888888888 2016-02-16 3 1
P088888888888 2016-02-11 3 2
P088888888888 2016-02-14 3 2
P088888888888 2016-02-12 1 3
P088888888888 2016-02-10 1 3
ROW_NUMBER
ROW_NUMBER() –從1開始,依照順序,生成分組內記錄的序列
–比方,依照pnum降序排列。生成分組內每天的pnum名次
ROW_NUMBER() 的應用場景許多。再比方,獲取分組內排序第一的記錄等等。
SELECT polno,
createtime,
pnum,
ROW_NUMBER() OVER(PARTITION BY polno ORDER BY pnum desc) AS rn
FROM windows_func;
結果:
polno createtime pnum rn
P066666666666 2016-02-15 20 1
P066666666666 2016-02-13 9 2
P066666666666 2016-02-10 6 3
P066666666666 2016-02-16 2 4
P066666666666 2016-02-11 2 5
P066666666666 2016-02-14 2 6
P066666666666 2016-02-12 1 7
P088888888888 2016-02-15 12 1
P088888888888 2016-02-13 9 2
P088888888888 2016-02-16 3 3
P088888888888 2016-02-11 3 4
P088888888888 2016-02-14 3 5
P088888888888 2016-02-12 1 6
P088888888888 2016-02-10 1 7
RANK 和 DENSE_RANK
—RANK() 生成數據項在分組中的排名,排名相等會在名次中留下空位
—DENSE_RANK() 生成數據項在分組中的排名,排名相等會在名次中不會留下空位
SELECT polno,
createtime,
pnum,
RANK() OVER(PARTITION BY polno ORDER BY pnum desc) AS rn1,
DENSE_RANK() OVER(PARTITION BY polno ORDER BY pnum desc) AS rn2,
ROW_NUMBER() OVER(PARTITION BY polno ORDER BY pnum DESC) AS rn3
FROM windows_func WHERE polno =‘P066666666666‘;
結果:
polno createtime pnum rn1 rn2 rn3
P066666666666 2016-02-15 20 1 1 1
P066666666666 2016-02-13 9 2 2 2
P066666666666 2016-02-10 6 3 3 3
P066666666666 2016-02-11 2 4 4 4
P066666666666 2016-02-14 2 4 4 5
P066666666666 2016-02-16 2 4 4 6
P066666666666 2016-02-12 1 7 5 7
Hive分析窗體函數之NTILE,ROW_NUMBER,RANK和DENSE_RANK