SparkSQL 中group by、grouping sets、rollup和cube方法的详解

1、group bygrouping setsrollupcube理论

  • group by 主要用来对查询的结果进行分组,相同组合的分组条件在结果集中只显示一行记录。可以添加聚合函数
  • grouping sets 对分组集中指定的组表达式的每个子集执行group bygroup by A,Bgrouping sets(A,B)就等价于 group by A union group by B,其中AB也可以是一个集合,比如group by A,B,C grouping sets((A,B),(A,C))
  • rollup 在指定表达式的每个层次级别创建分组集。group by A,B,C with rollup首先会对(A、B、C)进行group by,然后对(A、B)进行group by,然后是(A)进行group by,最后对全表进行group by操作。
  • cube 为指定表达式集的每个可能组合创建分组集。首先会对(A、B、C)进行group by,然后依次是(A、B)(A、C)(A)(B、C)(B)( C),最后对全表进行group by操作。

数据准备

case class MemberOrderInfo(area:String,memberType:String,product:String,price:Int)

import sqlContext.implicits._
val orders=Seq(
  MemberOrderInfo("深圳","钻石会员","钻石会员1个月",25),
  MemberOrderInfo("深圳","钻石会员","钻石会员1个月",25),
  MemberOrderInfo("深圳","钻石会员","钻石会员3个月",70),
  MemberOrderInfo("深圳","钻石会员","钻石会员12个月",300),
  MemberOrderInfo("深圳","铂金会员","铂金会员3个月",60),
  MemberOrderInfo("深圳","铂金会员","铂金会员3个月",60),
  MemberOrderInfo("深圳","铂金会员","铂金会员6个月",120),
  MemberOrderInfo("深圳","黄金会员","黄金会员1个月",15),
  MemberOrderInfo("深圳","黄金会员","黄金会员1个月",15),
  MemberOrderInfo("深圳","黄金会员","黄金会员3个月",45),
  MemberOrderInfo("深圳","黄金会员","黄金会员12个月",180),
  MemberOrderInfo("北京","钻石会员","钻石会员1个月",25),
  MemberOrderInfo("北京","钻石会员","钻石会员1个月",25),
  MemberOrderInfo("北京","铂金会员","铂金会员3个月",60),
  MemberOrderInfo("北京","黄金会员","黄金会员3个月",45),
  MemberOrderInfo("上海","钻石会员","钻石会员1个月",25),
  MemberOrderInfo("上海","钻石会员","钻石会员1个月",25),
  MemberOrderInfo("上海","铂金会员","铂金会员3个月",60),
  MemberOrderInfo("上海","黄金会员","黄金会员3个月",45)
)
//把seq转换成DataFrame
val memberDF:DataFrame =orders.toDF()
//把DataFrame注册成临时表
memberDF.registerTempTable("orderTempTable")

2、group by

group bySELECT语句的从句,用来指定查询分组条件,主要用来对查询的结果进行分组,相同组合的分组条件在结果集中只显示一行记录。使用group by从句时候,通过添加聚合函数(主要有COUNT()SUMMAX()MIN()等)可以使数据聚合。

 sqlContext.sql("select area,memberType,product,sum(price) as total from orderTempTable group by area,memberType,product")

执行结果

areamemberTypeproducttotal
深圳铂金会员铂金会员6个月120
深圳黄金会员黄金会员12个月180
深圳钻石会员钻石会员3个月70
深圳黄金会员黄金会员3个月45
深圳钻石会员钻石会员12个月300
北京黄金会员黄金会员3个月45
深圳钻石会员钻石会员1个月50
深圳黄金会员黄金会员1个月30
深圳铂金会员铂金会员3个月120
北京钻石会员钻石会员1个月50
北京铂金会员铂金会员3个月60
上海黄金会员黄金会员3个月45
上海钻石会员钻石会员1个月50
上海铂金会员铂金会员3个月60

3、grouping sets

a.grouping setsgroup by子句更进一步的扩展, 它让你能够定义多个数据分组。这样做使聚合更容易, 并且因此使得多维数据分析更容易。 b.够用grouping sets在同一查询中定义多个分组。

sqlContext.sql("select area,memberType,product,sum(price) as total from orderTempTable group by area,memberType,product grouping sets(area,memberType,product)")

上面的语句输出结果如下,可以看到使用grouping sets(area,memberType,product)会分别对这3个维度进行group by,也可以grouping sets ((area,memberType),(area,product)))此时相当于group by (area,memberType) union group by (area,product),也就是说grouping sets 后面可以指定你想要的各种维度组合。

执行结果

areamemberTypeproducttotal
nullnull铂金会员3个月240
null铂金会员null360
上海nullnull155
null钻石会员null520
nullnull钻石会员12个月300
nullnull黄金会员12个月180
nullnull钻石会员3个月70
nullnull黄金会员3个月135
深圳nullnull915
nullnull钻石会员1个月150
nullnull黄金会员1个月30
null黄金会员null345
北京nullnull155
nullnull铂金会员6个月120

4、rollup

rollup是根据维度在数据结果集中进行的聚合操作。

group by A,B,C with rollup首先会对(A、B、C)进行group by,然后对(A、B)进行group by,然后是(A)进行group by,最后对全表进行group by操作。

sqlContext.sql("select area,memberType,product,sum(price) as total from orderTempTable group by area,memberType,product with rollup")

执行结果

输出结果中,可以group by A,B,C with rollup,的确是上述几种group by的并集。

areamemberTypeproducttotal
上海上海null155
北京北京null60
北京北京null50
上海上海钻石会员1个月50
深圳深圳黄金会员1个月30
深圳深圳钻石会员12个月300
北京北京黄金会员3个月45
深圳深圳钻石会员3个月70
北京北京铂金会员3个月60
上海上海null60
上海上海null50
深圳深圳null255
深圳深圳null915
上海上海黄金会员3个月45
深圳深圳铂金会员3个月120
深圳深圳钻石会员1个月50
上海上海铂金会员3个月60
北京北京null45
深圳深圳null240
nullnullnull122
深圳深圳null420
北京北京null155
北京北京钻石会员1个月50
深圳深圳黄金会员12个月180
深圳深圳铂金会员6个月120
深圳深圳黄金会员3个月45
上海上海null45

5、cube

group by A,B,C with cube,则首先会对(A、B、C)进行group by,然后依次是(A、B)(A、C)(A)(B、C)(B)( C),最后对全表进行group by操作。

sqlContext.sql("select area,memberType,product,sum(price) as total from orderTempTable group by area,memberType,product with cube")

执行结果

areamemberTypeproducttotal
深圳null黄金会员12个月180
深圳null钻石会员3个月70
深圳null黄金会员3个月45
nullnull铂金会员3个月240
北京null铂金会员3个月60
null铂金会员null360
上海nullnull155
北京铂金会员null60
null钻石会员null520
北京钻石会员null50
上海钻石会员钻石会员1个月50
深圳黄金会员黄金会员1个月30
nullnull钻石会员12个月300
深圳钻石会员钻石会员12个月300
null黄金会员黄金会员12个月180
null铂金会员铂金会员6个月120
null黄金会员黄金会员3个月135
深圳null钻石会员1个月50
深圳null黄金会员1个月30
北京黄金会员金会员3个月45
nullnull黄金会员12个月180
上海null铂金会员3个月60
nullnull钻石会员3个月70
深圳钻石会员钻石会员3个月70
nullnull黄金会员3个月135
北京铂金会员铂金会员3个月60
北京null黄金会员3个月45
上海铂金会员null60
上海钻石会员null50
深圳黄金会员null255
null黄金会员黄金会员1个月30
深圳nullnull915
null钻石会员钻石会员12个月300
上海黄金会员黄金会员3个月45
深圳铂金会员铂金会员3个月120
nullnull钻石会员1个月150
深圳钻石会员钻石会员1个月50
nullnull黄金会员1个月30
北京null钻石会员1个月50
上海铂金会员铂金会员3个月60
上海null黄金会员3个月45
null钻石会员钻石会员3个月70
深圳null铂金会员6个月W120
null黄金会员null345
北京黄金会员null45
深圳null铂金会员3个月120
深圳铂金会员null240
nullnullnull1225
深圳钻石会员null420
北京nullnull155
null铂金会员铂金会员3个月240
上海null钻石会员1个月50
null钻石会员钻石会员1个月150
深圳null钻石会员12个月300
北京钻石会员钻石会员1个月50
深圳黄金会员黄金会员12个月180
深圳铂金会员铂金会员6个月120
深圳黄金会员黄金会员3个月45
nullnull铂金会员6个月120
上海黄金会员null45
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值