2023.12.14 hive sql的聚合增强函数 grouping set

 

目录

 

1.建库建表

 2.需求

 3.使用union all来完成需求

 4.聚合函数增强 grouping set

 5.聚合增强函数cube ,rollup

 6.rollup翻滚

7.聚合函数增强 -- grouping判断


1.建库建表

-- 建库
create database if not exists test;
use test;
-- 建表
create table test.t_cookie(month string, day string, cookieid string) 
row format delimited fields terminated by ',';
-- 数据样例内容
insert into test.t_cookie values
('2015-03','2015-03-10','cookie1'),
('2015-03','2015-03-10','cookie5'),
('2015-03','2015-03-12','cookie7'),
('2015-04','2015-04-12','cookie3'),
('2015-04','2015-04-13','cookie2'),
('2015-04','2015-04-13','cookie4'),
('2015-04','2015-04-16','cookie4'),
('2015-03','2015-03-10','cookie2'),
('2015-03','2015-03-10','cookie3'),
('2015-04','2015-04-12','cookie5'),
('2015-04','2015-04-13','cookie6'),
('2015-04','2015-04-15','cookie3'),
('2015-04','2015-04-15','cookie2'),
('2015-04','2015-04-16','cookie1');

建表完成后

 2.需求

分别按照月,天,月和天统计来访用户cookieid个数,并获取三者的结果集,一起插到目标宽表中

 3.使用union all来完成需求

  select month,null as day, count(cookieid) cnt from test.t_cookie 
group by monthunion allselect null as month, day,  count(cookieid) cnt from test.t_cookiegroup by dayunion allselect month,day, count(cookieid) cnt from test.t_cookie 
group by month,day;

使用union all的表

--这些指标都是来源from来自了一个表,因为是3个查询后的结果集进行合并
--这样的好处是可以在一个表中直观的看到多个结果
-- union all也单独占用了资源,当维度与指标多的时候,效率会很低
--group month ,day属于一个维度,因为是一起的

 4.聚合函数增强 grouping set

==grouping sets函数解释==:

  1. 就是通过指定的多个维度进行查询的. 即: 你写了哪些维度, 它就按照哪些维度进行聚合计算.

  2. 细节: 维度要用小括号括起来, 如果是1个维度, 小括号可以省略, 但是建议写上.

  3. grouping sets函数在hive中 和 presto中的写法略有不同

  4. 如果是在hive中, group by后边必须要写分组字段, 将来我们可以根据这些 分组字段的不同组合, 形成不同的维度. 如果是在Presto中, group by后边什么都不写, 因为它(presto)会根据你写的 维度, 自动根据字段进行分组.

==grouping sets函数优点==:

  1. 使用grouping sets==只会对表进行一次扫描==。

  2. 使用grouping sets==查询速度吊打==多个分组查询结果union all。

  3. 使用grouping sets==执行结果==与多个分组查询结果union all的结果集==一样==;

--grouping sets聚合增强函数
--依然是查询每月,每天,和月和天来统计用户个数 ,使用hive

        select month,day,count(cookieid)  cntfrom hive_test.t_cookiegroup by month, daygrouping sets ((month,day),(month),(day));select month,day,count(cookieid)  cntfrom hive_test.t_cookiegroup by month, daygrouping sets ((month,day),month,day); --括号可以省略

-- 下面这个是Presto SQL语法支持
 

  select month,day,count(cookieid) from test.t_cookie group bygrouping sets (month,day,(month,day));

总结:

--group by后面需要加维度字段名字

--维度要用小括号括起来,如果grouping set后面不写维度,默认就是所有维度,题目中就会count全部数量,最后结果是14

--grouping set的速度快了5倍,(month),day,month,(),单个指标括号可以省略,

--union all需要从上到下一个一个运行,grouping set 则是并行

 5.聚合增强函数cube ,rollup

以上的grouping set已经可以自定想要分组的维度了,但还是需要自己手动输入分组,那么cube可以只输入指定的原始维度字段,然后他就会考虑到所有维度的组合方式,自动生成所有排列组合情况,

例如: 你传入month, day, 就相当于写了 (), (month), (day), (month,day) 这四个维度

公式:假如说有==N个维度,那么所有维度的组合的个数:2^N==

-- 使用cube函数生成指定维度的所有组合
select month,day,count(cookieid)
from test.t_cookie
group by
cube (month, day);-- 上述sql等价于
select month,day,count(cookieid)
from test.t_cookie
group by
grouping sets ((month,day), month, day, ());

总结:

cube可以自动生成所有排列组合

但是cube默认所有组合,无法自己决定想组合的部分
group by后面不用加上原始维度 ,只有hive中grouping set需要在group by后面加维度字段

 6.rollup翻滚

  • rollup的功能:实现==从右到左多级递减==的统计,显示统计某一层次结构的聚合。

  • ==rollup函数解释==:

    按照你指定的字段, 进行维度组合查询, 它相当于是 cube的子集, cube是所有维度, rollup是部分维度. -- 例如: 你写的维度是a,b, 则组合后的维度有: (a,b), (a), ()

    即: 从右往左多级递减(结论, 记忆)

    写的维度假如是c,b,a 则组合后的维度有(c,b,a) , (c,b) , (c)  , ()

-- rollup的功能:实现从右到左递减多级的统计
select month,day,count(cookieid)
from test.t_cookie
group by
rollup (month,day);  -- (month,day),month,()-- 等价于
select month,day,count(cookieid)
from test.t_cookie
group by
grouping sets ((month,day), (month), ());

7.聚合函数增强 -- grouping判断

grouping的功能,判断当前数据是按照哪个字段来进行分组的,

grouping(维度字段1,维度字段2)

如果分组中有相应字段,则将位设置为0,否则将其设置为1,总之就是有0没1

在语法上,grouping 要求group by后面不能有分组字段,grouping set在hive上运行的时候要求加分组字段,所以 要想grouping和grouping set配合使用,必须在presto上运行,hive不行.

-- 在Presto引擎中进行执行
select month,day,count(cookieid),grouping(month)      as m,grouping(day)        as d,grouping(month, day) as m_d
from test.t_cookie
group by grouping sets (month, day, (month, day));

 有是0,没有是1,group by 
   grouping sets (month, day, (month, day));

第一行中month 和 day都是0,代表这分组没有这两个字段

第二行中,month为1,day为0,说明月是没有的,天是有的, 10是二进制,转为十进制后得到数字2

第三行中,月0日1,说明月有,01是二进制,转为十进制后得到数字1

grouping(month)列为0时,可以看到month列都是有值的,为1时则相反,证明当前行是按照month来进行分组统计的

grouping(day)列为0时,也看到day列有值,为1时day则相反,证明当前行时按照day来进行分组统计的

grouping(month, day)是grouping(month)、grouping(day)二进制数值组合后转换得到的数字

a. 按照month分组,则month=0,day=1,组合后为01,二进制转换为十进制得到数字1;
b. 按照day分组,则month=1,day=0,组合后为10,二进制转换为十进制得到数字2;
c. 同时按照month和day分组,则month=0,day=0,组合后为00,二进制转换为十进制得到数字0。

因此可以使用grouping操作来判断当前数据是按照哪个字段来分组的。

 grouping(日期、城市、商圈、店铺) = 1010(二进制) = 10(十进制)      证明有(城市, 店铺)维度

grouping(日期、城市、商圈、店铺) = 1001 = 9(十进制) 证明有( 城市, 商圈)维度 ​ grouping(日期、城市、商圈、店铺) = 0100 = 4(十进制) 证明有(日期, 商圈, 店铺)维度

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/219599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能导论习题集(2)

第三章:确定性推理 题1题2题3题4题5题6 题1 题2 题3 题4 题5 题6

免费!视频下方人物(照片)介绍字幕制作pr字幕条模板素材

Premiere Pro模板,具有15个视频下方三分之一处添加人物介绍(图像)字幕pr字幕条模板素材下载。 适用于Premiere Pro 2019及以上版本。可以更改颜色更改样式。在视频的开头、中间和结尾使用。包括视频教程。不包括音乐。来自PR模板网:https://prmuban.com/…

Mac 中文版 Navicat Premium 16 下载安装详细教程

哈喽朋友们大家好,今天做一期 Mac 数据库连接工具 Navicat Premium 16 的安装教程,很多朋友不知道怎么安装的,要不就是有试用期无法正常使用,要不就是英文的,改不了中文,大家可以跟着我的步骤安装&#xff…

视频推拉流平台EasyDSS点播文件播放请求添加token验证的实现方法

EasyDSS视频直播点播平台可提供一站式的视频推拉流、转码、点播、直播、播放H.265编码视频等服务,搭配RTMP高清摄像头使用,可将设备的实时流推送到平台上,实现无人机视频推流直播等应用。今天我们来介绍下EasyDSS系统点播文件播放请求添加tok…

Linux---创建、删除文件及目录命令

1. 创建、删除文件及目录命令的使用 命令说明touch 文件名创建指定文件mkdir 目录名创建目录(文件夹)rm 文件名或者目录名删除指定文件或者目录rmdir 目录名删除空目录 touch命令效果图: mkdir命令效果图: rm命令效果图: rm删除目录效果图 说明: rm命令想要删除目录需要加上…

HTML---表单

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 一.表单概念 HTML表单是网页上用于收集用户输入信息的一种元素。它由一系列输入字段(input)、选择字段(select)、文本区域(textarea&a…

缓存雪崩问题与应对策略

目录 1. 缓存雪崩的原因 1.1 缓存同时失效 1.2 缓存层无法应对高并发 1.3 缓存和后端系统之间存在紧密关联 2. 缓存雪崩的影响 2.1 系统性能下降 2.2 数据库压力激增 2.3 用户请求失败率增加 3. 应对策略 3.1 多级缓存 3.2 限流与降级 3.3 异步缓存更新 3.4 并发控…

​Linux Ubuntu环境下安装配置Docker 和Docker、compose、mysql、中文版portainer

​Linux Ubuntu环境下安装配置Docker 和Docker、compose、mysql、中文版portainer 这篇文章探讨了在Linux Ubuntu环境下安装和配置Docker及其相关工具的过程。首先介绍了Docker的基本概念,然后详细讲解了在Ubuntu系统上的安装步骤。随后,文章涵盖了Dock…

智能优化算法应用:基于旗鱼算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于旗鱼算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于旗鱼算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.旗鱼算法4.实验参数设定5.算法结果6.参考文献7.MA…

yaml 文件格式

yaml文件:是一种标记语言,以竖列形式展示序列化的时间格式,可读性高 类似于json格式。语法简单。 yaml通过缩进来表示数据结构,连续的项目用-减号来表示。 yaml文件使用的注意事项: 1,大小写敏感 2&am…

Apache Web 服务器监控工具

将Apache Web 服务器监控纳入 IT 基础架构管理策略有助于先发制人地识别性能瓶颈,这种主动监控方法提供必要的数据,以确保 Web 服务器能够胜任任务,并在需要时进行优化。保证客户获得流畅、无忧的用户体验可以大大有助于巩固他们对组织的信任…

SSL证书过期怎么更新?

一、概述 SSL证书是用于加密网站和客户端之间通信的一种数字证书,可以确保数据传输的安全性和保密性。然而,SSL证书是有有效期的,一旦过期就需要及时更新。本文将介绍如何更新SSL证书,以确保网站的安全性和正常运行。 二、SSL证…

【字符串】ABC324E

退役啦,接下来的博客全是图一乐啦 E - Joint Two Strings 题意 思路 统计两个指针的方案数一定是枚举一个,统计另一个 然后因为拼起来之后要包含 t 这个字符串,隐隐约约会感觉到和前缀后缀子序列有关 考虑预处理每个 s[i] 的最长公共前…

gRPC-Gateway:高效转换 RESTful 接口 | 开源日报 No.105

grpc-ecosystem/grpc-gateway Stars: 16.4k License: BSD-3-Clause gRPC-Gateway 是一个遵循 gRPC HTTP 规范的 gRPC 到 JSON 代理生成器。它是 Google 协议缓冲编译器 protoc 的插件,可以读取 protobuf 服务定义并生成反向代理服务器,将 RESTful HTTP…

pycharm中如何去除波浪线的设置

pycharm中,碰到恼人的红绿波浪线,打开’file-settings’,然后,参照如图设置,去除’effects’选项:

【Linux服务器Java环境搭建】09 在CentOS系统中安装和配置clickhouse数据库

一、安装环境 CentOS7 二、官网安装参考文档 官网安装参考文档 不同系统请参考如下建议 从RPM软件包安装: 建议在CentOS、RedHat和所有其他基于rpm的Linux发行版上使用官方预编译的rpm软件包从DEB软件包安装: 建议在Debian或Ubuntu上使用官方预编译…

C语言 联合体验证 主机字节序 +枚举

联合体应用&#xff1a;验证当前主机的大小端&#xff08;字节序&#xff09; //验证当前主机的大小端 #include <stdio.h>union MyData {unsigned int data;struct{unsigned char byte0;unsigned char byte1;unsigned char byte2;unsigned char byte3;}byte; };int main…

详细说说vuex

Vuex 是什么 Vuex有几个属性及作用注意事项vuex 使用举例Vuex3和Vuex4有哪些区别 创建 Store 的方式在组件中使用 Store辅助函数的用法响应式的改进Vuex4 支持多例模式 Vuex 是什么 Vuex是一个专门为Vue.js应用设计的状态管理构架&#xff0c;它统一管理和维护各个Vue组件的可…

【深度学习】Pytorch 系列教程(一):PyTorch数据结构:1、Tensor(张量)及其维度(Dimensions)、数据类型(Data Types)

文章目录 一、前言二、实验环境三、PyTorch数据结构0、分类1、Tensor&#xff08;张量&#xff09;1. 维度&#xff08;Dimensions&#xff09;0维&#xff08;标量&#xff09;1维&#xff08;向量&#xff09;2维&#xff08;矩阵&#xff09;3维张量 2. 数据类型&#xff08…

报告称超 5 成职场人员有兼职 ,有人因做副业被降薪或被辞,有哪些信息值得关注?你有下班兼职的打算吗?

在职程序员分享身边几个做兼职的案例&#xff1a; 前领导从21年开始做小红书账号&#xff0c;粉丝30w&#xff0c;月入5w左右&#xff1b; 隔壁工位的哥们每隔几个月都会在平台接点小单&#xff0c;今年赚了小几万&#xff1b; 室友每天开车上班顺便接顺风车单子&#xff0c;一…