在平时的工作中,经常有按照不同维度筛选和统计数据的需求。拿视频会员订单数据来说吧,运营人员要查看深圳市的成功下单数或则深圳市某一种产品的成功下单数或者某一种产品的所有成功下单数时,每天的订单数又很大,现查的话按照不同的维度去查询又很慢。此时本篇文章或许会帮助到你。

group by:主要用来对查询的结果进行分组,相同组合的分组条件在结果集中只显示一行记录。可以添加聚合函数。

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))。

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")

接下来我们通过操作 orderTempTable 来看一下grouping sets、group by、rollup和cube具体如何使用。

1.group by

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

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

执行结果如下,可以看到结果中按照area,memberType,product来做聚合sum操作。

+----+----------+--------+---+

|area|memberType|product |total|

+----+----------+--------+---+

|深圳 |铂金会员 |铂金会员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 |

+----+----------+--------+---+

2.grouping sets

a.grouping sets是group 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 后面可以指定你想要的各种维度组合。

+----+----------+--------+-----+

|area|memberType|product |total|

+----+----------+--------+-----+

|null|null |铂金会员3个月 |240 |

|null|铂金会员 |null |360 |

|上海 |null |null |155 |

|null|钻石会员 |null |520 |

|null|null |钻石会员12个月|300 |

|null|null |黄金会员12个月|180 |

|null|null |钻石会员3个月 |70 |

|null|null |黄金会员3个月 |135 |

|深圳 |null |null |915 |

|null|null |钻石会员1个月 |150 |

|null|null |黄金会员1个月 |30 |

|null|黄金会员 |null |345 |

|北京 |null |null |155 |

|null|null |铂金会员6个月 |120 |

+----+----------+--------+-----+

3.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的并集。

+----+----------+--------+-----+

|area|memberType|product |total|

+----+----------+--------+-----+

|上海 |null |null |155 |

|北京 |铂金会员 |null |60 |

|北京 |钻石会员 |null |50 |

|上海 |钻石会员 |钻石会员1个月 |50 |

|深圳 |黄金会员 |黄金会员1个月 |30 |

|深圳 |钻石会员 |钻石会员12个月|300 |

|北京 |黄金会员 |黄金会员3个月 |45 |

|深圳 |钻石会员 |钻石会员3个月 |70 |

|北京 |铂金会员 |铂金会员3个月 |60 |

|上海 |铂金会员 |null |60 |

|上海 |钻石会员 |null |50 |

|深圳 |黄金会员 |null |255 |

|深圳 |null |null |915 |

|上海 |黄金会员 |黄金会员3个月 |45 |

|深圳 |铂金会员 |铂金会员3个月 |120 |

|深圳 |钻石会员 |钻石会员1个月 |50 |

|上海 |铂金会员 |铂金会员3个月 |60 |

|北京 |黄金会员 |null |45 |

|深圳 |铂金会员 |null |240 |

|null|null |null |1225 |

|深圳 |钻石会员 |null |420 |

|北京 |null |null |155 |

|北京 |钻石会员 |钻石会员1个月 |50 |

|深圳 |黄金会员 |黄金会员12个月|180 |

|深圳 |铂金会员 |铂金会员6个月 |120 |

|深圳 |黄金会员 |黄金会员3个月 |45 |

|上海 |黄金会员 |null |45 |

+----+----------+--------+-----+

4.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")

+----+----------+--------+-----+

|area|memberType|product |total|

+----+----------+--------+-----+

|深圳 |null |黄金会员12个月|180 |

|深圳 |null |钻石会员3个月 |70 |

|深圳 |null |黄金会员3个月 |45 |

|null|null |铂金会员3个月 |240 |

|北京 |null |铂金会员3个月 |60 |

|null|铂金会员 |null |360 |

|上海 |null |null |155 |

|北京 |铂金会员 |null |60 |

|null|钻石会员 |null |520 |

|北京 |钻石会员 |null |50 |

|上海 |钻石会员 |钻石会员1个月 |50 |

|深圳 |黄金会员 |黄金会员1个月 |30 |

|null|null |钻石会员12个月|300 |

|深圳 |钻石会员 |钻石会员12个月|300 |

|null|黄金会员 |黄金会员12个月|180 |

|null|铂金会员 |铂金会员6个月 |120 |

|null|黄金会员 |黄金会员3个月 |135 |

|深圳 |null |钻石会员1个月 |50 |

|深圳 |null |黄金会员1个月 |30 |

|北京 |黄金会员 |黄金会员3个月 |45 |

|null|null |黄金会员12个月|180 |

|上海 |null |铂金会员3个月 |60 |

|null|null |钻石会员3个月 |70 |

|深圳 |钻石会员 |钻石会员3个月 |70 |

|null|null |黄金会员3个月 |135 |

|北京 |铂金会员 |铂金会员3个月 |60 |

|北京 |null |黄金会员3个月 |45 |

|上海 |铂金会员 |null |60 |

|上海 |钻石会员 |null |50 |

|深圳 |黄金会员 |null |255 |

|null|黄金会员 |黄金会员1个月 |30 |

|深圳 |null |null |915 |

|null|钻石会员 |钻石会员12个月|300 |

|上海 |黄金会员 |黄金会员3个月 |45 |

|深圳 |铂金会员 |铂金会员3个月 |120 |

|null|null |钻石会员1个月 |150 |

|深圳 |钻石会员 |钻石会员1个月 |50 |

|null|null |黄金会员1个月 |30 |

|北京 |null |钻石会员1个月 |50 |

|上海 |铂金会员 |铂金会员3个月 |60 |

|上海 |null |黄金会员3个月 |45 |

|null|钻石会员 |钻石会员3个月 |70 |

|深圳 |null |铂金会员6个月 |120 |

|null|黄金会员 |null |345 |

|北京 |黄金会员 |null |45 |

|深圳 |null |铂金会员3个月 |120 |

|深圳 |铂金会员 |null |240 |

|null|null |null |1225 |

|深圳 |钻石会员 |null |420 |

|北京 |null |null |155 |

|null|铂金会员 |铂金会员3个月 |240 |

|上海 |null |钻石会员1个月 |50 |

|null|钻石会员 |钻石会员1个月 |150 |

|深圳 |null |钻石会员12个月|300 |

|北京 |钻石会员 |钻石会员1个月 |50 |

|深圳 |黄金会员 |黄金会员12个月|180 |

|深圳 |铂金会员 |铂金会员6个月 |120 |

|深圳 |黄金会员 |黄金会员3个月 |45 |

|null|null |铂金会员6个月 |120 |

|上海 |黄金会员 |null |45 |

+----+----------+--------+-----+

5.应用

经过group by、grouping sets、rollup和cube处理过后的数据可以直接存储到MySQL等数据库中。文章开头中提到的需求,可以根据运营提出的筛选维度进行cube分析,就可以得到各种维度组合下的订单统计结果。比如要获取总的定单数。可以如下处理:

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

cubeDF .registerTempTable("resultTempTable")

//下面SQL执行的结果就是所有订单的总数

sqlContext.sql("select * from resultTempTable where area=null and memberType=null and product =null")

mysql group by cube_SparkSQL 中group by、grouping sets、rollup和cube方法详解相关推荐

  1. python二维元组_python中读入二维csv格式的表格方法详解(以元组/列表形式表示)

    如何去读取一个没有表头的二维csv文件(如下图所示)? 并以元组的形式表现数据: ((1.0, 0.0, 3.0, 180.0), (2.0, 0.0, 2.0, 180.0), (3.0, 0.0, ...

  2. python可以使用二维元组吗_python中读入二维csv格式的表格方法详解(以元组/列表形式表示)...

    怎么去读取一个没有表头的二维csv文件(如下图所示)? 并以元组的形式表现数据: ((1.0, 0.0, 3.0, 180.0), (2.0, 0.0, 2.0, 180.0), (3.0, 0.0, ...

  3. python反向缩进_在Pycharm中对代码进行注释和缩进的方法详解

    在Pycharm中对代码进行注释和缩进的方法详解 一.注释 1. #单行注释 2. """ 多行注释 """ 3. pycharm多行注释快 ...

  4. python元组读取到列表_python中读入二维csv格式的表格方法详解(以元组/列表形式表示)...

    如何去读取一个没有表头的二维csv文件(如下图所示)? 并以元组的形式表现数据: ((1.0, 0.0, 3.0, 180.0), (2.0, 0.0, 2.0, 180.0), (3.0, 0.0, ...

  5. python 读取图片转换为一维向量_对Python中一维向量和一维向量转置相乘的方法详解...

    对Python中一维向量和一维向量转置相乘的方法详解 在Python中有时会碰到需要一个一维列向量(n*1)与另一个一维列向量(n*1)的转置(1*n)相乘,得到一个n*n的矩阵的情况.但是在pyth ...

  6. thinkphp3.1.3 getshell_C# / VB.NET 在PPT中创建、编辑PPT SmartArt图形的方法详解_C#教程...

    本文介绍通过C#和程序代码来创建和编辑PPT文档中的SmartArt图形.文中将分两个操作示例来演示创建和编辑结果. 使用工具:Spire.Presentation for .NET hotfix 5 ...

  7. python读二进制格点雷达基数据_对numpy中二进制格式的数据存储与读取方法详解...

    使用save可以实现对numpy数据的磁盘存储,存储的方式是二进制.查看使用说明,说明专门提到了是未经压缩的二进制形式.存储后的数据可以进行加载或者读取,通过使用load方法. In [81]:np. ...

  8. python中的sep参数_Python sep参数使用方法详解

    Python sep参数使用方法详解 这篇文章主要介绍了Python sep参数使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Pyth ...

  9. mysql 不通过关联查询表_mysql中多表不关联查询的实现方法详解

    下面小编就为大家带来一篇浅谈mysql中多表不关联查询的实现方法.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 大家在使用MySQL查询时正常是直接一个表的查询,要不然 ...

最新文章

  1. Shippable和Packet合作提供原生ARM CI/CD
  2. 汇总Javascript各种判断脚本(javascript经典例子)
  3. 网络空间站是计算机,超级病毒或入侵国际空间站生命维持计算机
  4. C# 学习笔记(9)线程
  5. 用Java和Java 8创建内部DSL,采用Martin Fowler的方法
  6. 大楼通信综合布线系统_某办公大楼综合布线系统设计实例,小白可以借鉴一下,大神请绕路...
  7. Python中math模块的使用
  8. 联想投资服务器5g芯片,从5G投票到要没必要做芯片,联想到了最危险的时候
  9. tcp段重组--suricata实现
  10. kindeditor java上传_富文本编辑器kindeditor上传图片的配置方法
  11. tomcat 404错误 原因_软件测试人员定位bug原因的10大妙招分享
  12. 抖音c语言表白编码,抖音表白脚本-抖音代码表白大全最新完整版 - 极光下载站...
  13. 解决win10删除文件时找不到该项目的问题
  14. 微信小程序文档api
  15. 因为涉嫌歧视女性被开除的那位工程师到底在备忘录上写了什么?
  16. Windows下的Node.js安装及环境配置
  17. office修复找不到msi_office2013安装出错,老是出现找不到officeMUI.msi或则officeMUI.xml等,是什么原 - Microsoft Community...
  18. python姿态检测实现多人多姿态识别python行为识别openpose行为骨骼框架检测动作识别动作检测行为动作分类
  19. python制作天气预报软件(UI界面)
  20. java生成表格图片

热门文章

  1. 【值得学习】售前工程师的成长(四)---一个老员工的经验之谈
  2. 在Windows Server 2008中安装Exchange Server 2007 SP1
  3. Yii --EClientScript 扩展,css,js文件代码压缩合并加载
  4. SQL 时间截按月分组查询
  5. SQL Server中删除重复数据的几个方法
  6. J2EE学习笔记(1)
  7. 前端项目集成 stylelint
  8. 2018年山西省环境空气质量综合指数平均下降10.8%
  9. redis持久化、内存优化、过期、LRU内存
  10. 关于Ubuntu下apt的一些用法及和yum的比较