tft每日頭條

 > 生活

 > spark sql 自定義計算列

spark sql 自定義計算列

生活 更新时间:2024-07-01 16:13:51

在平時的工作中,經常有按照不同維度篩選和統計數據的需求。拿某信貸公司的進件數據來說吧,運營人員想要查看某一天或某城市的成功進件數量或者某城市某一渠道的成功進件數量或者某一渠道的所有成功進件數量時,每天的進件量又很大,現查的話按照不同的維度去查詢又很慢。此時本篇文章或許會幫助到你。

group by:主要用來對查詢的結果進行分組,相同組合的分組條件在結果集中隻顯示一行記錄。可以添加聚合函數。

舉個栗子:

select due_date,status,count(*) from bill where due_date in ('2020-06-01','2020-06-02') group by due_date,status order by 1,2

查詢結果

spark sql 自定義計算列(sparksql多維度分析之groupingsetsrollup)1

grouping sets:對分組集中指定的組表達式的每個子集執行group by,group by A,B grouping sets(A,B)就等價于 group by A union group by B,其中A和B也可以是一個集合,比如group by A,B,C grouping sets((A,B),(A,C))。

舉個栗子:

select due_date,status,count(*) from bill where due_date in ('2020-06-01','2020-06-02') group by grouping sets(due_date,status) order by 1,2

查詢結果:

spark sql 自定義計算列(sparksql多維度分析之groupingsetsrollup)2

rollup:在指定表達式的每個層次級别創建分組集。group by A,B,C with rollup首先會對(A、B、C)進行group by,然後對(A、B)進行group by,然後是(A)進行group by,最後對全表進行group by操作。

舉個栗子:

select due_date,status,count(*) from bill where due_date in ('2020-06-01','2020-06-02') group by due_date,status WITH CUBE order by 1,2

查詢結果:

spark sql 自定義計算列(sparksql多維度分析之groupingsetsrollup)3

cube:為指定表達式集的每個可能組合創建分組集。首先會對(A、B、C)進行group by,然後依次是(A、B),(A、C),(A),(B、C),(B),( C),最後對全表進行group by操作。

舉個栗子:

select due_date,status,count(*) from bill where due_date in ('2020-06-01','2020-06-02') group by due_date,status WITH CUBE order by 1,2

查詢結果:

spark sql 自定義計算列(sparksql多維度分析之groupingsetsrollup)4

grouping():區分null值

grouping函數用來區分NULL值,這裡NULL值有2種情況,一是原本表中的數據就為NULL,二是由rollup、cube、grouping sets生成的NULL值。

  當為第一種情況中的空值時,grouping(NULL)返回0;當為第二種情況中的空值時,grouping(NULL)返回1

grouping隻能有一個參數

注意:grouping 函數隻能和grouping_sets,roullup,cube函數一起使用,否則會報錯

以上面rollup的結果集為例:

select case when grouping(due_date)=1 then 'Roll_Up' else due_date end as due_date ,case when grouping(status)=1 then 'Roll_Up' else status end as status ,count(*) as cnt from bill where due_date in ('2020-06-01','2020-06-02') group by due_date,status with rollup order by 1,2

查詢結果:

spark sql 自定義計算列(sparksql多維度分析之groupingsetsrollup)5

由此可比較出上面rollup結果集中為null的數據由于grouping函數為1,故顯示Roll_Up字符串。

grouping_id()

grouping_id函數也是計算分組級别的函數,注意如果要使用grouping_id函數那必須得有group by字句,而且group by字句的中的列與grouping_id函數的參數必須相等。比如group by A,B,那麼必須使用grouping_id(A,B)。下面用一個等效關系來說明grouping_id()與grouping()的聯系,grouping_id(A, B)等效于grouping(A) grouping(B),但要注意這裡的 号不是算術相加,它表示的是二進制數據組合在一起,比如grouping(A)=1,grouping(B)=1,那麼grouping_id(A, B)=11B,也就是十進制數3

舉個栗子:

select grouping(due_date) ,grouping(status) ,grouping_id(due_date,status) ,due_date ,status ,count(*) as cnt from bill where due_date in ('2020-06-01','2020-06-02') group by due_date,status with cube

查詢結果:

spark sql 自定義計算列(sparksql多維度分析之groupingsetsrollup)6

spark sql 自定義計算列(sparksql多維度分析之groupingsetsrollup)7

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved