日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hive之窗口函数(一文搞懂)

發布時間:2023/12/14 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hive之窗口函数(一文搞懂) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

窗口函數簡單說就是在執行聚合函數時指定一個操作窗口。窗口函數執行順序基本靠后,在全局排序order by和limit之前執行

1.相關函數說明

OVER():指定分析函數工作的數據窗口大小,這個數據窗口大小可能會隨著行的變而變化。

重點解釋下OVER()函數,OVER()函數中包括三個函數:

包括分區partition by 列名、排序order by 列名、指定窗口范圍rows between開始位置and結束位置。我們在使用over()窗口函數時,over()函數中的這三個函數可組合使用也可以不使用。

over()函數中如果不使用這三個函數,窗口大小是針對查詢產生的所有數據,如果指定了分區,窗口大小是針對每個分區的數據。

1)、partition by 可理解為group by分組。over(partition by 列名)搭配分析函數時,分析函數按照每一組每一組的數據進行計算的。

2)、rows between開始位置 and 結束位置

是指定窗口范圍,比如第一行到當前行。而這個范圍是隨著數據變化的。over(rows between 開始位置 and 結束位置)搭配分析函數時,分析函數按照這個范圍進行計算的

窗口范圍說明:
我們常使用的窗口范圍是ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(表示從起點到當前行),常用該窗口來計算累加。

PRECEDING:往前 FOLLOWING:往后 CURRENT ROW:當前行 UNBOUNDED:起點(一般結合PRECEDING,FOLLOWING使用) UNBOUNDED PRECEDING 表示該窗口最前面的行(起點) UNBOUNDED FOLLOWING:表示該窗口最后面的行(終點) LAG(col,n,default_val):往前第n行數據,沒有數據的話用default_val代替 LEAD(col,n, default_val):往后第n行數據,沒有數據的話用default_val代替 NTILE(n):把有序分區中的行分發到指定數據的組中,各個組有編號,編號從1開始,對于每一行,NTILE返回此行所屬的組的編號。注意:n必須為int類型。 比如說: ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(表示從窗口起點到當前行) ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING(表示往前2行到往后1行) ROWS BETWEEN 2 PRECEDING AND 1 CURRENT ROW(表示往前2行到當前行) ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING(表示當前行到終點)

2.數據準備: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

3.需求

  • 查詢在2017年4月份購買過的顧客及總人數
  • 查詢顧客的購買明細及月購買總額
  • 上述的場景, 將每個顧客的cost按照日期進行累加
  • 查詢每個顧客上次的購買時間
  • 查詢前20%時間的訂單信息
  • 4.創建本地business.txt,導入數據

    [hadoop@hadoop100?datas]$ vi business.txt

    5.創建hive表并導入數據

    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;

    6.按需求查詢數據

    1)、查詢在2017年4月份購買過的顧客及總人數, over() 默認為查詢全部的窗口。

    select?name,count(*) over ()

    from business?

    where substring(orderdate,1,7) = '2017-04'

    group by name;

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

    select name,orderdate,cost,sum(cost) over(partition by month(orderdate)) from

    ?business;

    -- 按顧客和月份分組

    select name,orderdate,cost,sum(cost) over(partition by?name,month(orderdate)) from

    ?business;

    3)上述的場景, 將每個顧客的cost按照日期進行累加

    select?name,orderdate,cost,

    sum(cost) over() as sample1,--所有行相加

    sum(cost) over(partition by name) as sample2,--按name分組,組內數據相加

    sum(cost) over(partition by name order by orderdate) as sample3,--按name分組,組內數據累加

    sum(cost) over(partition by name order by orderdate rows between UNBOUNDED PRECEDING and current row ) as sample4 ,--和sample3一樣,由起點到當前行的聚合

    sum(cost) over(partition by name order by orderdate rows between 1 PRECEDING and current row) as sample5, --當前行和前面一行做聚合

    sum(cost) over(partition by name order by orderdate rows between 1 PRECEDING AND 1 FOLLOWING ) as sample6,--當前行和前邊一行及后面一行

    sum(cost) over(partition by name order by orderdate rows between current row and UNBOUNDED FOLLOWING ) as sample7 --當前行及后面所有行

    from business;

    rows必須跟在Order by 子句之后,對排序的結果進行限制,使用固定的行數來限制分區中的數據行數量

    4)查看顧客上次的購買時間

    select name,orderdate,cost,

    lag(orderdate,1,'1900-01-01') over(partition by name order by orderdate ) as time1,

    lag(orderdate,2) over (partition by name order by orderdate) as time2

    from business;

    5)查詢前20%時間的訂單信息

    select * from (

    ????select name,orderdate,cost, ntile(5) over(order by orderdate) sorted

    ????from business

    ) t

    where sorted = 1;

    窗口函數在sql運行的最后才執行,所以需要用自查詢的方式進行條件過濾。

    7.Rank函數

    RANK() 排序相同時會重復,總數不會變 1、1、 3、4

    DENSE_RANK() 排序相同時會重復,總數會減少 1、1、 2、3

    ROW_NUMBER() 會根據順序計算1、2、3、4

    1、需求

    1、每門學科學生成績排名(是否并列排名、空位排名三種實現) 2、每門學科成績排名top n的學生

    2、原始數據(學生成績信息)

    name subject score 孫悟空 語文 87 孫悟空 數學 95 孫悟空 英語 68 大海 語文 94 大海 數學 56 大海 英語 84 宋宋 語文 64 宋宋 數學 86 宋宋 英語 84 婷婷 語文 65 婷婷 數學 85 婷婷 英語 78

    3、建表并加載數據

    create table score ( name string, subject string, score int ) row format delimited fields terminated by "\t";#加載數據 load data local inpath '/home/hadoop000/data/hive/score.txt' into table score;

    4、每門學科學生成績排名(是否并列排名、空位排名三種實現)

    select *, rank()over(partition by subject order by score desc) as rank, row_number()over(partition by subject order by score desc) as row_number, dense_rank()over(partition by subject order by score desc) as dense_rank from score

    5、每門學科成績排名top n的學生

    select * from ( select *, row_number() over(partition by subject order by score desc) rmp from score ) t where t.rmp<=3;

    ?8.lag/lead() over()

    LAG(col,n,DEFAULT)?用于統計窗口內往上第n行值

    第一個參數為列名,第二個參數為往上第n行(默認為1),第三個參數為默認值(當往上第n行為NULL時候,取默認值,如不指定,則為NULL)?

    LEAD(col,n,DEFAULT)?用于統計窗口內往下第n行值

    第一個參數為列名,第二個參數為往下第n行(默認為1),第三個參數為默認值(當往下第n行為NULL時候,取默認值,如不指定,則為NULL)

    1、數據準備

    create table t_hosp(user_name string ,age int ,in_hosp date ,out_hosp date) row format delimited fields terminated by ',';xiaohong,25,2020-05-12,2020-06-03 xiaoming,30,2020-06-06,2020-06-15 xiaohong,25,2020-06-14,2020-06-19 xiaoming,30,2020-06-20,2020-07-02

    2、需求:求同一個患者每次住院與上一次出院的時間間隔

    step1:

    select user_name ,age ,in_hosp ,out_hosp ,LAG(out_hosp,1,in_hosp) OVER(PARTITION BY user_name ORDER BY out_hosp asc) AS pre_out_date from t_hosp ; 其中,LAG(out_hosp,1,in_hosp) OVER(PARTITION BY user_name ORDER BY out_hosp asc) 表示根據user_name分組按照out_hosp升序取每條數據的上一條數據的out_hosp, 如果上一條數據為空,則使用默認值in_hosp來代替

    step2:每條數據的in_hosp與pre_out_date的差值即本次住院日期與上次出院日期的間隔

    select user_name,age,in_hosp,out_hosp, LAG(out_hosp,1,in_hosp) OVER(PARTITION BY user_name ORDER BY out_hosp asc) AS pre_out_date, datediff(in_hosp,LAG(out_hosp,1,in_hosp) OVER(PARTITION BY user_name ORDER BY out_hosp asc)) as days from t_hosp;

    ?補充:通過執行show functions;命令查詢hive的內置函數還有詳細的用法

    總結

    以上是生活随笔為你收集整理的Hive之窗口函数(一文搞懂)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。