成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊聊Hive常見(jiàn)的分析函數(shù)

大數(shù)據(jù)
dense_rank函數(shù)的功能與rank函數(shù)類似,dense_rank函數(shù)在生成序號(hào)時(shí)是連續(xù)的,而rank函數(shù)生成的序號(hào)有可能不連續(xù)。當(dāng)出現(xiàn)名次相同時(shí),則排名序號(hào)也相同。而下一個(gè)排名的序號(hào)與上一個(gè)排名序號(hào)是連續(xù)的。

[[402112]]

本文轉(zhuǎn)載自微信公眾號(hào)「大數(shù)據(jù)技術(shù)與數(shù)倉(cāng)」,作者西貝。轉(zhuǎn)載本文請(qǐng)聯(lián)系大數(shù)據(jù)技術(shù)與數(shù)倉(cāng)公眾號(hào)。

 1.基本語(yǔ)法

  1. Function (arg1,..., argn) OVER ([PARTITION BY <...>] [ORDER BY <....>] 
  2. [<window_expression>]) 

Function (arg1,..., argn) 可以是下面的四類函數(shù):

  • Aggregate Functions: 聚合函數(shù),比如:sum(...)、 max(...)、min(...)、avg(...)等
  • Sort Functions: 數(shù)據(jù)排序函數(shù), 比如 :rank(...)、row_number(...)等
  • Analytics Functions: 統(tǒng)計(jì)和比較函數(shù), 比如:lead(...)、lag(...)、 first_value(...)等

2.數(shù)據(jù)準(zhǔn)備

樣例數(shù)據(jù)

  1. [職工姓名|部門編號(hào)|職工ID|工資|崗位類型|入職時(shí)間] 
  2. Michael|1000|100|5000|full|2014-01-29 
  3. Will|1000|101|4000|full|2013-10-02 
  4. Wendy|1000|101|4000|part|2014-10-02 
  5. Steven|1000|102|6400|part|2012-11-03 
  6. Lucy|1000|103|5500|full|2010-01-03 
  7. Lily|1001|104|5000|part|2014-11-29 
  8. Jess|1001|105|6000|part|2014-12-02 
  9. Mike|1001|106|6400|part|2013-11-03 
  10. Wei|1002|107|7000|part|2010-04-03 
  11. Yun|1002|108|5500|full|2014-01-29 
  12. Richard|1002|109|8000|full|2013-09-01 

建表語(yǔ)句:

  1. CREATE TABLE IF NOT EXISTS employee ( 
  2. name string, 
  3. dept_num int
  4. employee_id int
  5. salary int
  6. type string, 
  7. start_date date 
  8. ROW FORMAT DELIMITED 
  9. FIELDS TERMINATED BY '|' 
  10. STORED as TEXTFILE; 

加載數(shù)據(jù)

  1. load data local inpath '/opt/datas/data/employee_contract.txt' into table employee; 

3.窗口聚合函數(shù)

(1)查詢姓名、部門編號(hào)、工資以及部門人數(shù)

  1. select  
  2.     name
  3.     dept_num as deptno , 
  4.     salary, 
  5.     count(*) over (partition by dept_num) as cnt  
  6. from employee ; 

結(jié)果輸出:

  1. name    deptno  salary  cnt 
  2. Lucy    1000    5500    5 
  3. Steven  1000    6400    5 
  4. Wendy   1000    4000    5 
  5. Will    1000    4000    5 
  6. Michael 1000    5000    5 
  7. Mike    1001    6400    3 
  8. Jess    1001    6000    3 
  9. Lily    1001    5000    3 
  10. Richard 1002    8000    3 
  11. Yun     1002    5500    3 
  12. Wei     1002    7000    3 

(2)查詢姓名、部門編號(hào)、工資以及每個(gè)部門的總工資,部門總工資按照降序輸出

  1. select  
  2.     name , 
  3.     dept_num as deptno, 
  4.     salary, 
  5.     sum(salary) over (partition by dept_num order by dept_num) as sum_dept_salary  
  6. from employee  
  7. order by sum_dept_salary desc

結(jié)果輸出:

  1. name    deptno  salary  sum_dept_salary 
  2. Michael 1000    5000    24900 
  3. Will    1000    4000    24900 
  4. Wendy   1000    4000    24900 
  5. Steven  1000    6400    24900 
  6. Lucy    1000    5500    24900 
  7. Wei     1002    7000    20500 
  8. Yun     1002    5500    20500 
  9. Richard 1002    8000    20500 
  10. Lily    1001    5000    17400 
  11. Jess    1001    6000    17400 
  12. Mike    1001    6400    17400 

4.窗口排序函數(shù)

簡(jiǎn)介

窗口排序函數(shù)提供了數(shù)據(jù)的排序信息,比如行號(hào)和排名。在一個(gè)分組的內(nèi)部將行號(hào)或者排名作為數(shù)據(jù)的一部分進(jìn)行返回,最常用的排序函數(shù)主要包括:

row_number:根據(jù)具體的分組和排序,為每行數(shù)據(jù)生成一個(gè)起始值等于1的唯一序列數(shù)

rank:對(duì)組中的數(shù)據(jù)進(jìn)行排名,如果名次相同,則排名也相同,但是下一個(gè)名次的排名序號(hào)會(huì)出現(xiàn)不連續(xù)。比如查找具體條件的topN行

dense_rank:dense_rank函數(shù)的功能與rank函數(shù)類似,dense_rank函數(shù)在生成序號(hào)時(shí)是連續(xù)的,而rank函數(shù)生成的序號(hào)有可能不連續(xù)。當(dāng)出現(xiàn)名次相同時(shí),則排名序號(hào)也相同。而下一個(gè)排名的序號(hào)與上一個(gè)排名序號(hào)是連續(xù)的。

percent_rank:排名計(jì)算公式為:(current rank - 1)/(total number of rows - 1)

ntile:將一個(gè)有序的數(shù)據(jù)集劃分為多個(gè)桶(bucket),并為每行分配一個(gè)適當(dāng)?shù)耐皵?shù)。它可用于將數(shù)據(jù)劃分為相等的小切片,為每一行分配該小切片的數(shù)字序號(hào)。

(1)查詢姓名、部門編號(hào)、工資、排名編號(hào)(按工資的多少排名)

  1. select  
  2.    name , 
  3.    dept_num as dept_no , 
  4.    salary, 
  5.    row_number() over (order by salary desc ) rnum  
  6. from employee; 

結(jié)果輸出:

  1. name    dept_no salary  rnum 
  2. Richard 1002    8000    1 
  3. Wei     1002    7000    2 
  4. Mike    1001    6400    3 
  5. Steven  1000    6400    4 
  6. Jess    1001    6000    5 
  7. Yun     1002    5500    6 
  8. Lucy    1000    5500    7 
  9. Lily    1001    5000    8 
  10. Michael 1000    5000    9 
  11. Wendy   1000    4000    10 
  12. Will    1000    4000    11 

(2)查詢每個(gè)部門工資最高的兩個(gè)人的信息(姓名、部門、薪水)

  1. select  
  2.    name
  3.    dept_num, 
  4.    salary  
  5. from 
  6.  select name , 
  7.    dept_num , 
  8.    salary, 
  9.    row_number() over (partition by dept_num order by salary desc ) rnum  
  10.  from employee) t1 
  11.  where rnum <= 2; 

結(jié)果輸出:

  1. name    dept_num        salary 
  2. Steven  1000    6400 
  3. Lucy    1000    5500 
  4. Mike    1001    6400 
  5. Jess    1001    6000 
  6. Richard 1002    8000 
  7. Wei     1002    7000 

(3)查詢每個(gè)部門的員工工資排名信息

  1. select 
  2.  name , 
  3.  dept_num as dept_no , 
  4.  salary,row_number() over (partition by dept_num order by salary desc ) rnum  
  5. from employee; 

結(jié)果輸出:

  1. name    dept_no salary  rnum 
  2. Steven  1000    6400    1 
  3. Lucy    1000    5500    2 
  4. Michael 1000    5000    3 
  5. Wendy   1000    4000    4 
  6. Will    1000    4000    5 
  7. Mike    1001    6400    1 
  8. Jess    1001    6000    2 
  9. Lily    1001    5000    3 
  10. Richard 1002    8000    1 
  11. Wei     1002    7000    2 
  12. Yun     1002    5500    3 

(4)使用rank函數(shù)進(jìn)行排名

  1. select 
  2.   name
  3.   dept_num, 
  4.   salary, 
  5.   rank() over (order by salary desc) rank 
  6. from employee; 

結(jié)果輸出:

  1. name    dept_num        salary  rank 
  2. Richard 1002    8000    1 
  3. Wei     1002    7000    2 
  4. Mike    1001    6400    3 
  5. Steven  1000    6400    3 
  6. Jess    1001    6000    5 
  7. Yun     1002    5500    6 
  8. Lucy    1000    5500    6 
  9. Lily    1001    5000    8 
  10. Michael 1000    5000    8 
  11. Wendy   1000    4000    10 
  12. Will    1000    4000    10 

(5)使用dense_rank進(jìn)行排名

  1. select 
  2.   name
  3.   dept_num, 
  4.   salary, 
  5.   dense_rank() over (order by salary desc) rank 
  6. from employee; 

結(jié)果輸出:

  1. name    dept_num        salary  rank 
  2. Richard 1002    8000    1 
  3. Wei     1002    7000    2 
  4. Mike    1001    6400    3 
  5. Steven  1000    6400    3 
  6. Jess    1001    6000    4 
  7. Yun     1002    5500    5 
  8. Lucy    1000    5500    5 
  9. Lily    1001    5000    6 
  10. Michael 1000    5000    6 
  11. Wendy   1000    4000    7 
  12. Will    1000    4000    7 

(6)使用percent_rank()進(jìn)行排名

  1. select 
  2.   name
  3.   dept_num, 
  4.   salary, 
  5.   percent_rank() over (order by salary desc) rank 
  6. from employee; 

結(jié)果輸出:

  1. name    dept_num        salary  rank 
  2. Richard 1002    8000    0.0 
  3. Wei     1002    7000    0.1 
  4. Mike    1001    6400    0.2 
  5. Steven  1000    6400    0.2 
  6. Jess    1001    6000    0.4 
  7. Yun     1002    5500    0.5 
  8. Lucy    1000    5500    0.5 
  9. Lily    1001    5000    0.7 
  10. Michael 1000    5000    0.7 
  11. Wendy   1000    4000    0.9 
  12. Will    1000    4000    0.9 

(7)使用ntile進(jìn)行數(shù)據(jù)分片排名

  1. SELECT 
  2. name
  3. dept_num as deptno, 
  4. salary, 
  5. ntile(4) OVER(ORDER BY salary descas ntile 
  6. FROM employee; 

結(jié)果輸出:

  1. name    deptno  salary  ntile 
  2. Richard 1002    8000    1 
  3. Wei     1002    7000    1 
  4. Mike    1001    6400    1 
  5. Steven  1000    6400    2 
  6. Jess    1001    6000    2 
  7. Yun     1002    5500    2 
  8. Lucy    1000    5500    3 
  9. Lily    1001    5000    3 
  10. Michael 1000    5000    3 
  11. Wendy   1000    4000    4 
  12. Will    1000    4000    4 

從 Hive v2.1.0開(kāi)始, 支持在OVER語(yǔ)句里使用聚集函數(shù),比如

  1. SELECT 
  2.   dept_num, 
  3.   row_number() OVER (PARTITION BY dept_num ORDER BY sum(salary)) as rk 
  4. FROM employee 
  5. GROUP BY dept_num; 

結(jié)果輸出:

  1. dept_num        rk 
  2. 1000    1 
  3. 1001    1 
  4. 1002    1 

5.窗口分析函數(shù)

常用的分析函數(shù)主要包括:

  • cume_dist

如果按升序排列,則統(tǒng)計(jì):小于等于當(dāng)前值的行數(shù)/總行數(shù)(number of rows ≤ current row)/(total number of rows)。如果是降序排列,則統(tǒng)計(jì):大于等于當(dāng)前值的行數(shù)/總行數(shù)。比如,統(tǒng)計(jì)小于等于當(dāng)前工資的人數(shù)占總?cè)藬?shù)的比例 ,用于累計(jì)統(tǒng)計(jì)。

  • lead(value_expr[,offset[,default]])

用于統(tǒng)計(jì)窗口內(nèi)往下第n行值。第一個(gè)參數(shù)為列名,第二個(gè)參數(shù)為往下第n行(可選,默認(rèn)為1),第三個(gè)參數(shù)為默認(rèn)值(當(dāng)往下第n行為NULL時(shí)候,取默認(rèn)值,如不指定,則為NULL

  • lag(value_expr[,offset[,default]]):

與lead相反,用于統(tǒng)計(jì)窗口內(nèi)往上第n行值。第一個(gè)參數(shù)為列名,第二個(gè)參數(shù)為往上第n行(可選,默認(rèn)為1),第三個(gè)參數(shù)為默認(rèn)值(當(dāng)往上第n行為NULL時(shí)候,取默認(rèn)值,如不指定,則為NULL)

  • first_value: 取分組內(nèi)排序后,截止到當(dāng)前行,第一個(gè)值
  • last_value

取分組內(nèi)排序后,截止到當(dāng)前行,最后一個(gè)值

  • (1)統(tǒng)計(jì)小于等于當(dāng)前工資的人數(shù)占總?cè)藬?shù)的比例
  1. SELECT 
  2.  name
  3.  dept_num as deptno, 
  4.  salary, 
  5.  cume_dist() OVER (ORDER BY salary) as cume 
  6. FROM employee; 

結(jié)果輸出:

  1. name    deptno  salary  cume 
  2. Wendy   1000    4000    0.18181818181818182 
  3. Will    1000    4000    0.18181818181818182 
  4. Lily    1001    5000    0.36363636363636365 
  5. Michael 1000    5000    0.36363636363636365 
  6. Yun     1002    5500    0.5454545454545454 
  7. Lucy    1000    5500    0.5454545454545454 
  8. Jess    1001    6000    0.6363636363636364 
  9. Mike    1001    6400    0.8181818181818182 
  10. Steven  1000    6400    0.8181818181818182 
  11. Wei     1002    7000    0.9090909090909091 
  12. Richard 1002    8000    1.0 

(2)統(tǒng)計(jì)大于等于當(dāng)前工資的人數(shù)占總?cè)藬?shù)的比例

  1. SELECT 
  2.  name
  3.  dept_num as deptno, 
  4.  salary, 
  5.  cume_dist() OVER (ORDER BY salary descas cume 
  6. FROM employee; 

結(jié)果輸出:

  1. name    deptno  salary  cume 
  2. Richard 1002    8000    0.09090909090909091 
  3. Wei     1002    7000    0.18181818181818182 
  4. Mike    1001    6400    0.36363636363636365 
  5. Steven  1000    6400    0.36363636363636365 
  6. Jess    1001    6000    0.45454545454545453 
  7. Yun     1002    5500    0.6363636363636364 
  8. Lucy    1000    5500    0.6363636363636364 
  9. Lily    1001    5000    0.8181818181818182 
  10. Michael 1000    5000    0.8181818181818182 
  11. Wendy   1000    4000    1.0 
  12. Will    1000    4000    1.0 

(3)按照部門統(tǒng)計(jì)小于等于當(dāng)前工資的人數(shù)占部門總?cè)藬?shù)的比例

  1. SELECT 
  2.  name
  3.  dept_num as deptno, 
  4.  salary, 
  5.  cume_dist() OVER (PARTITION BY dept_num ORDER BY salary) as cume 
  6. FROM employee; 

結(jié)果輸出:

  1. name    deptno  salary  cume 
  2. Wendy   1000    4000    0.4 
  3. Will    1000    4000    0.4 
  4. Michael 1000    5000    0.6 
  5. Lucy    1000    5500    0.8 
  6. Steven  1000    6400    1.0 
  7. Lily    1001    5000    0.3333333333333333 
  8. Jess    1001    6000    0.6666666666666666 
  9. Mike    1001    6400    1.0 
  10. Yun     1002    5500    0.3333333333333333 
  11. Wei     1002    7000    0.6666666666666666 
  12. Richard 1002    8000    1.0 

(4)按部門分組,統(tǒng)計(jì)每個(gè)部門員工的工資以及大于等于該員工工資的下一個(gè)員工的工資

  1. SELECT 
  2.  name
  3.  dept_num as deptno, 
  4.  salary, 
  5.  lead(salary,1) OVER (PARTITION BY dept_num ORDER BY salary) as lead 
  6. FROM employee; 

結(jié)果輸出:

  1. name    deptno  salary  lead 
  2. Wendy   1000    4000    4000 
  3. Will    1000    4000    5000 
  4. Michael 1000    5000    5500 
  5. Lucy    1000    5500    6400 
  6. Steven  1000    6400    NULL 
  7. Lily    1001    5000    6000 
  8. Jess    1001    6000    6400 
  9. Mike    1001    6400    NULL 
  10. Yun     1002    5500    7000 
  11. Wei     1002    7000    8000 
  12. Richard 1002    8000    NULL 

(5)按部門分組,統(tǒng)計(jì)每個(gè)部門員工的工資以及小于等于該員工工資的上一個(gè)員工的工資

  1. SELECT 
  2.  name
  3.  dept_num as deptno, 
  4.  salary, 
  5.  lag(salary,1) OVER (PARTITION BY dept_num ORDER BY salary) as lead 
  6. FROM employee; 

結(jié)果輸出:

  1. name    deptno  salary  lead 
  2. Wendy   1000    4000    NULL 
  3. Will    1000    4000    4000 
  4. Michael 1000    5000    4000 
  5. Lucy    1000    5500    5000 
  6. Steven  1000    6400    5500 
  7. Lily    1001    5000    NULL 
  8. Jess    1001    6000    5000 
  9. Mike    1001    6400    6000 
  10. Yun     1002    5500    NULL 
  11. Wei     1002    7000    5500 
  12. Richard 1002    8000    7000 

(6)按部門分組,統(tǒng)計(jì)每個(gè)部門員工工資以及該部門最低的員工工資

  1. SELECT 
  2.  name
  3.  dept_num as deptno, 
  4.  salary, 
  5.  first_value(salary) OVER (PARTITION BY dept_num ORDER BY salary) as fval 
  6. FROM employee; 

結(jié)果輸出:

  1. name    deptno  salary  fval 
  2. Wendy   1000    4000    4000 
  3. Will    1000    4000    4000 
  4. Michael 1000    5000    4000 
  5. Lucy    1000    5500    4000 
  6. Steven  1000    6400    4000 
  7. Lily    1001    5000    5000 
  8. Jess    1001    6000    5000 
  9. Mike    1001    6400    5000 
  10. Yun     1002    5500    5500 
  11. Wei     1002    7000    5500 
  12. Richard 1002    8000    5500 

(7)按部門分組,統(tǒng)計(jì)每個(gè)部門員工工資以及該部門最高的員工工資

  1. SELECT 
  2.  name
  3.  dept_num as deptno, 
  4.  salary, 
  5.  last_value(salary) OVER (PARTITION BY dept_num ORDER BY salary RANGE 
  6. BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as lval 
  7. FROM employee; 

結(jié)果輸出:

  1. name    deptno  salary  lval 
  2. Wendy   1000    4000    6400 
  3. Will    1000    4000    6400 
  4. Michael 1000    5000    6400 
  5. Lucy    1000    5500    6400 
  6. Steven  1000    6400    6400 
  7. Lily    1001    5000    6400 
  8. Jess    1001    6000    6400 
  9. Mike    1001    6400    6400 
  10. Yun     1002    5500    8000 
  11. Wei     1002    7000    8000 
  12. Richard 1002    8000    8000 

注意:last_value默認(rèn)的窗口是RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW,表示當(dāng)前行永遠(yuǎn)是最后一個(gè)值,需改成RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING。

img

  • RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

為默認(rèn)值,即當(dāng)指定了ORDER BY從句,而省略了window從句 ,表示從開(kāi)始到當(dāng)前行。

  • RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING

表示從當(dāng)前行到最后一行

  • RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING

表示所有行

  • n PRECEDING m FOLLOWING

表示窗口的范圍是:[(當(dāng)前行的行數(shù))- n, (當(dāng)前行的行數(shù))+m]

 

責(zé)任編輯:武曉燕 來(lái)源: 大數(shù)據(jù)技術(shù)與數(shù)倉(cāng)
相關(guān)推薦

2021-09-08 08:55:45

Javascript 高階函數(shù)前端

2023-11-28 09:19:12

2022-01-04 06:50:12

數(shù)據(jù)摘要方法

2022-03-17 08:34:47

TypeScript項(xiàng)目類型

2022-11-30 08:19:15

內(nèi)存分配Go逃逸分析

2022-02-07 21:49:19

串行通信UART

2022-03-30 09:01:37

CSS屬性函數(shù)

2022-09-28 11:34:27

用戶行為數(shù)據(jù)業(yè)務(wù)

2020-07-24 10:31:34

未授權(quán)訪問(wèn)漏洞

2020-03-31 09:09:48

Web安全網(wǎng)絡(luò)攻擊DDOS

2022-10-24 00:03:26

GolangNew函數(shù)

2022-07-07 08:01:51

Python魔法方法代碼

2021-03-02 21:52:48

Hive數(shù)據(jù)類型

2022-10-17 08:22:28

2021-09-08 06:51:53

CountDownLa閉鎖源碼

2023-05-04 00:27:40

2022-08-02 11:29:17

數(shù)據(jù)分析場(chǎng)景RFM

2021-06-05 23:39:52

c++函數(shù)場(chǎng)景

2021-09-28 07:12:09

Linux內(nèi)核入口

2023-07-26 07:13:55

函數(shù)接口Java 8
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩精品一二三 | 91麻豆精品国产91久久久更新资源速度超快 | 久久九九99 | 日韩欧美一区二区三区 | 欧美日韩1区2区3区 欧美久久一区 | 特一级毛片 | 男人av在线播放 | 日本三级网站在线观看 | 瑟瑟激情| 91精品国产91久久综合桃花 | 人人性人人性碰国产 | 99色综合 | 夜夜草天天草 | 99国产精品99久久久久久粉嫩 | 中文字字幕在线中文乱码范文 | 欧区一欧区二欧区三免费 | 久久精品国产一区二区电影 | 丁香综合 | 亚洲在线一区二区 | 久久国产精品一区 | 极品销魂美女一区二区 | 亚洲国产精品网站 | 亚洲欧美一区在线 | 国产精品中文 | 国内自拍第一页 | 9999精品视频 | 国产精品区一区二区三 | 伊人久久综合 | 亚洲a一区 | 一区精品在线观看 | 免费在线观看一区二区三区 | 在线观看成人 | 精品一区二区三区四区外站 | av一区二区在线观看 | 美女在线观看av | 久在线视频播放免费视频 | 在线播放国产一区二区三区 | 中文字幕国产视频 | 国产精品美女一区二区三区 | 精品欧美乱码久久久久久 | 成人精品网 |