当前位置: 首页 > news >正文

Groupings sets详解

目录

  • 概要
  • 使用方法介绍
  • 示例

概要

GROUPING SETS在SELECT语句中的使用,它扩展了GROUP BY的功能,允许一次性执行多种分组操作,提高了查询效率。hive,spark,presto中都有此函数。以下介绍以sparksql为例;

使用方法介绍

首先需要提醒一点的是,hql中和sparksql中虽然均有grouping sets函数,可是grouping__id顺序确是相反的,一般情况我们习惯了hql中保持一致,需要脚本中增加:set spark.grouping.sets.reference.hive=true;

基本使用,是在group by 维度值后,使用grouping sets ((a,b,c),(a,b),©)像这样;

SELECT a, b, SUM( c ) FROM tab1 GROUP BY a, b GROUPING SETS ( (a,b), a)
###等价于
SELECT a, b, SUM( c ) FROM tab1 GROUP BY a, b
UNION
SELECT a, null, SUM( c ) FROM tab1 GROUP BY a

示例

有这样一份数据,统计了不同维度下用户数和浏览次数,维度有日期(day),平台(platform)和频道(channel);

具体代码如下:

select day,platform,channel,sum(pv) as pv,sum(imei_num) as imei_num
from 
(SELECT  day,if((cast(grouping__id as int) & 1) = 0,'ALL',platform) as platform,if((cast(grouping__id as int) & 2) = 0,'ALL',channel) as channel,SUM(pv) as pv,imei,max(if(pv>0,1,0)) as imei_num
FROM tmp_read_pv
GROUP BY  platform, channel,day,imei
GROUPING SETS ( 
(platform,channel,imei,day),
(platform,imei,day),
(channel,imei,day),
(imei,day))) tt GROUP BY  platform, channel,day;

一般情况下,涉及到人数去重,我们习惯于嵌套两层,最里面一层加上imei维度,最外面再把imei去掉;

现在思考一个问题,如果我们维度比较多,比如有8个维度,里面还涉及到去重指标,我们该怎么做呢?如果直接使用grouping sets
再加上imei,共有9个维度,直接写需要 2 9 2^9 29行,如果直接用with cube,因为里面有imei数据量比较大,几乎跑不动。那该如何呢?

方法:多段使用grouping sets ,比如你有9个(加imei)维度,你可以第一次先group by 5个(加imei)维度,其他几个维度当做指标
,此时4个维度,都有all枚举值,第二次使用grouping sets ,group by 两个维度,再加上第一次的5个,剩下两个依然当做指标,grouping sets里面需要注意一下,这4个维度不用再增加ALL枚举值,此时这两个维度也有all枚举值,最后一次再新增两个维度,group by 两个维度,再加上前两次的7个维度,注意事项同上,此时最后两个维度也有ALL枚举值。在最后把imei维度去掉再聚合一层,就能得出最终结果;

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 东方银行--用 MinIO 和 Dremio 替代 Hadoop
  • React18快速入门教程
  • C HTML格式解析与生成
  • 浅谈Kafka(二)
  • EmguCV学习笔记 VB.Net 第5章 图像变换
  • 【机器学习】 1. 总览介绍
  • 开源大屏设计工具DataRoom
  • Elasticsearch:使用 ELSER 进行语义搜索 - sparse_vector
  • 在pytorch中TensorBoard的使用
  • OpenCV c++ 实现图像马赛克效果
  • Magenta——利用深度学习生成音乐和艺术内容
  • 基于STM32的温湿度采集设计
  • npm install` 报错
  • 【软件测试面试题】WEB功能测试(持续更新)
  • 黑神话:悟空-配置推荐
  • php的引用
  • ES6指北【2】—— 箭头函数
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • CSS3 变换
  • HTTP--网络协议分层,http历史(二)
  • JavaScript的使用你知道几种?(上)
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • SpriteKit 技巧之添加背景图片
  • ubuntu 下nginx安装 并支持https协议
  • ViewService——一种保证客户端与服务端同步的方法
  • webpack入门学习手记(二)
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 彻底搞懂浏览器Event-loop
  • 程序员该如何有效的找工作?
  • 从零开始的无人驾驶 1
  • 前端代码风格自动化系列(二)之Commitlint
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 微服务入门【系列视频课程】
  • 再谈express与koa的对比
  • 智能合约Solidity教程-事件和日志(一)
  • 自动记录MySQL慢查询快照脚本
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • #预处理和函数的对比以及条件编译
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (33)STM32——485实验笔记
  • (6)设计一个TimeMap
  • (NSDate) 时间 (time )比较
  • (poj1.3.2)1791(构造法模拟)
  • (安卓)跳转应用市场APP详情页的方式
  • (二十三)Flask之高频面试点
  • (分类)KNN算法- 参数调优
  • (七)Activiti-modeler中文支持
  • (原)本想说脏话,奈何已放下
  • (转)memcache、redis缓存
  • ..回顾17,展望18