Hive視窗函式案例

2021-10-08 23:28:59 字數 3488 閱讀 3786

資料準備:

name,orderdate,cost

jack,2017-01-01,10 

tony,2017-01-02,15

jack,2017-02-03,23

tony,2017-01-04,29

jack,2017-01-05,46

jack,2017-04-06,42

tony,2017-01-07,50

jack,2017-01-08,55

mart,2017-04-08,62

mart,2017-04-09,68

neil,2017-05-10,12

mart,2017-04-11,75

neil,2017-06-12,80

mart,2017-04-13,94

需求:

(1)查詢在 2017 年 4 月份購買過的顧客及總人數

(2)查詢顧客的購買明細及月購買總額

(3)上述的場景,要將 cost 按照日期進行累加

(4)查詢每個顧客上次的購買時間

(5)查詢前 20%時間的訂單資訊

建表並匯入資料:

create

table business(

name string,

orderdate string,

cost int

)row format delimited fields

terminated

by','

;load

data

local inpath "/opt/module/datas/business.txt"

into

table business

(1)查詢在 2017 年 4 月份購買過的顧客及總人數:

select name,

count(*

)over()

from business

where

month

(orderdate)

='04'

group

by name;

結果:

mart	2

jack 2

(2)查詢顧客的購買明細及月購買總額

select name,orderdate,cost,

sum(cost)

over

(partition

by name,

month

(orderdate)

)from business

group

by name,orderdate,cost;

結果:

jack	2017-01-05	46	111

jack 2017-01-08 55 111

jack 2017-01-01 10 111

jack 2017-02-03 23 23

jack 2017-04-06 42 42

mart 2017-04-09 68 299

mart 2017-04-13 94 299

mart 2017-04-11 75 299

mart 2017-04-08 62 299

neil 2017-05-10 12 12

neil 2017-06-12 80 80

tony 2017-01-02 15 94

tony 2017-01-04 29 94

tony 2017-01-07 50 94

(3)上述的場景,要將 cost 按照日期進行累加

select name,orderdate,cost,

sum(cost)

over

(distribute by name sort by cost)

from business;

結果:

jack	2017-01-05	46	111

jack 2017-01-08 55 111

jack 2017-01-01 10 111

jack 2017-02-03 23 23

jack 2017-04-06 42 42

mart 2017-04-09 68 299

mart 2017-04-13 94 299

mart 2017-04-11 75 299

mart 2017-04-08 62 299

neil 2017-05-10 12 12

neil 2017-06-12 80 80

tony 2017-01-02 15 94

tony 2017-01-04 29 94

tony 2017-01-07 50 94

(4)查詢每個顧客上次的購買時間

select name,orderdate,lag(orderdate,1,

'2000-01-01'

)over

(distribute by name sort by orderdate)

from business;

結果:

jack	2017-01-01	2000-01-01

jack 2017-01-05 2017-01-01

jack 2017-01-08 2017-01-05

jack 2017-02-03 2017-01-08

jack 2017-04-06 2017-02-03

mart 2017-04-08 2000-01-01

mart 2017-04-09 2017-04-08

mart 2017-04-11 2017-04-09

mart 2017-04-13 2017-04-11

neil 2017-05-10 2000-01-01

neil 2017-06-12 2017-05-10

tony 2017-01-02 2000-01-01

tony 2017-01-04 2017-01-02

tony 2017-01-07 2017-01-04

(5)查詢前 20%時間的訂單資訊

select

*from

(select name,orderdate,cost,ntile(5)

over

(order

by orderdate)

as t

from business) t1

where t=

1

結果:

jack	2017-01-01	10	1

tony 2017-01-02 15 1

tony 2017-01-04 29 1

Hive視窗函式

1 定義 視窗函式屬於sql中比較高階的函式 mysql從8.0版本才支援視窗函式,5.6,5.7都沒有視窗函式 oracle 裡面一直支援視窗函式 hive也支援視窗函式 以下函式才是視窗函式 視窗函式 13個 lead lead col,n,default val 往後第n行資料 col 列名 ...

hive 視窗函式

hive高階函式 row number rank dense rank 這三個視窗函式的使用場景非常多 例子 員工表中,求每個崗位薪水前兩名的員工資訊 name,入職日期,sal row number over partition by job order by sal desc 這個函式會返回組內...

hive視窗函式 Hive sql視窗函式原始碼分析

在了解了視窗函式實現原理 spark hive中視窗函式實現原理覆盤 和 sparksql比hivesql優化的點 視窗函式 之後,今天又擼了一遍hive sql 中視窗函式的原始碼實現,寫個筆記記錄一下。簡單來說,視窗查詢有兩個步驟 將記錄分割成多個分割槽 然後在各個分割槽上呼叫視窗函式。傳統的 ...