1. 程式人生 > >Hive分析窗體函數之NTILE,ROW_NUMBER,RANK和DENSE_RANK

Hive分析窗體函數之NTILE,ROW_NUMBER,RANK和DENSE_RANK

des div 切片 post content part 相等 ren 分組內排序

繼續介紹幾個序列函數:

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