hive、spark、presto 中的增强聚合-grouping sets、rollup、cube

news2024/11/26 1:50:28

目录

1、什么是增强聚合和多维分析函数?

2、grouping sets - 指定维度组合

3、with rollup - 上卷维度组合

4、with cube - 全维度组合

5、Grouping__ID、grouping() 的使用场景

6、使用 增强聚合 会不会对查询性能有提升呢?

7、对grouping sets、with cube、with rollup 的优化


1、什么是增强聚合和多维分析函数?

        增强聚合指的是:

                在SQL中使用分组聚合查询时,使用 grouping sets、rollup、cube 语句进行操作

                在常见的数据引擎中都支持这种语法,比如hive、spark、presto、ck、flinkSQL

                使用增强聚合不仅可以简化SQL代码,而且还能对SQL语句的性能有所提升

        多维分析指的是:

                SQL语法中的多维分析指的是 多种维度组合的分析,而不是多种维度的分析

         hive官网链接:hive官网

                


2、grouping sets - 指定维度组合

功能说明:

        对指定的分组字段进行多种维度组合的聚合计算

hive-语法:

-- TODO 必须开区map端合并
select 
     维度A
    ,维度B
    ,维度C
    ,聚合函数(度量字段) 
    ,grouping__id
from 表名 [where ]
group by A,B,C 
grouping sets( (A),(A,B),(A,B,C),..维度组合 )
presto、FlinkSQL、SparkSQL-语法:
select 
     维度A
    ,维度B
    ,维度C
    ,聚合函数(度量字段) 
    ,grouping(A,B,C) as grouping_id
from 表名 [where ]
group by
grouping sets( (A),(A,B),(A,B,C),..维度组合 )

语法区别:

        1、hiveSQL中 group by 后面必须添加分组的字段

             presto、flinksql、sparksql group by 后面不需要指定分组字段

        2、hiveSQL中 可以使用 grouping__id字段

              presto、flinksql、sparksql 中并没有提供 grouping__id字段,需要使用grouping(a,b,c) 函数来计算

代码示例(HiveSQL):

-- TODO 必须开区map端合并
set hive.map.aggr=true;
SELECT prov,city,area,count(1),grouping__id
FROM (select '河北省' as prov,'石家庄市' as city,'新华区' as area,'张1' as name union all 
      select '河北省','石家庄市','新华区','张2' union all 
      select '河南省','郑州市','高开区','张3' union all 
      select '河南省','郑州市','高开区','张4' union all 
      select '河南省','郑州市','高开区','张5' union all 
      select '河南省','新乡市','中华区','张6') AS person_info_df
group by prov,city,area grouping sets (
    (prov,city,area),
    (prov)
)
;

代码示例(presto、flinkSQL、sparkSQL):

SELECT prov,city,area,count(1),grouping(prov,city,area) as grouping_id
FROM (VALUES  ('河北省','石家庄市','新华区','张1'),
              ('河北省','石家庄市','新华区','张2'),
              ('河南省','郑州市','高开区','张3'),
              ('河南省','郑州市','高开区','张4'),
              ('河南省','郑州市','高开区','张5'),
              ('河南省','新乡市','中华区','张6')) AS person_info_df (prov,city,area,name)
group by grouping sets (
    (prov,city,area),
    (prov)
)
;

3、with rollup - 上卷维度组合

功能说明:

        上卷维度组合,较grouping sets相比,不需要指定维度组合

         GROUP BY a, b, c, WITH ROLLUP  等价于  

         GROUP BY a, b, c GROUPING SETS ( (a, b, c), (a, b), (a), ( ))

hive-语法:

-- TODO 必须开区map端合并
select 
     维度A
    ,维度B
    ,维度C
    ,聚合函数(度量字段) 
    ,grouping__id
from 表名 [where ]
group by A,B,C 
with rollup

presto、FlinkSQL、SparkSQL-语法:

select 
     维度A
    ,维度B
    ,维度C
    ,聚合函数(度量字段) 
    ,grouping(A,B,C) as grouping_id
from 表名 [where ]
group by
rollup(A,B,C) 

代码示例(HiveSQL):

-- 1.必须开区map端合并
set hive.map.aggr=true;
SELECT prov,city,area,count(1),grouping__id
FROM (select '河北省' as prov,'石家庄市' as city,'新华区' as area,'张1' as name union all 
      select '河北省','石家庄市','新华区','张2' union all 
      select '河南省','郑州市','高开区','张3' union all 
      select '河南省','郑州市','高开区','张4' union all 
      select '河南省','郑州市','高开区','张5' union all 
      select '河南省','新乡市','中华区','张6') AS person_info_df
group by prov,city,area with rollup
;

代码示例(presto、flinkSQL、sparkSQL):

SELECT prov,city,area,count(1),grouping(prov,city,area) as grouping_id
FROM (VALUES  ('河北省','石家庄市','新华区','张1'),
              ('河北省','石家庄市','新华区','张2'),
              ('河南省','郑州市','高开区','张3'),
              ('河南省','郑州市','高开区','张4'),
              ('河南省','郑州市','高开区','张5'),
              ('河南省','新乡市','中华区','张6')) AS person_info_df (prov,city,area,name)
group by rollup(prov,city,area) 
;

4、with cube - 全维度组合

功能说明:

        多维度组合,会计算所有分组字段的维度组合,较grouping sets相比,不需要指定维度组合

         GROUP BY a, b, c, WITH CUBE  等价于  

         GROUP BY a, b, c GROUPING SETS ( (a, b, c), (a, b), (b, c), (a, c), (a), (b), (c), ( ))

cube(key1,key2...) 维度组合数:

hive-语法:

-- TODO 必须开区map端合并
select 
     维度A
    ,维度B
    ,维度C
    ,聚合函数(度量字段) 
    ,grouping__id
from 表名 [where ]
group by A,B,C 
with cube

presto、FlinkSQL、SparkSQL-语法:

select 
     维度A
    ,维度B
    ,维度C
    ,聚合函数(度量字段) 
    ,grouping(A,B,C) as grouping_id
from 表名 [where ]
group by
cube(A,B,C) 

代码示例(HiveSQL):

-- 1.必须开区map端合并
set hive.map.aggr=true;
SELECT prov,city,area,count(1),grouping__id
FROM (select '河北省' as prov,'石家庄市' as city,'新华区' as area,'张1' as name union all 
      select '河北省','石家庄市','新华区','张2' union all 
      select '河南省','郑州市','高开区','张3' union all 
      select '河南省','郑州市','高开区','张4' union all 
      select '河南省','郑州市','高开区','张5' union all 
      select '河南省','新乡市','中华区','张6') AS person_info_df
group by prov,city,area with cube
;

代码示例(presto、flinkSQL、sparkSQL):

SELECT prov,city,area,count(1),grouping(prov,city,area) as grouping_id
FROM (VALUES  ('河北省','石家庄市','新华区','张1'),
              ('河北省','石家庄市','新华区','张2'),
              ('河南省','郑州市','高开区','张3'),
              ('河南省','郑州市','高开区','张4'),
              ('河南省','郑州市','高开区','张5'),
              ('河南省','新乡市','中华区','张6')) AS person_info_df (prov,city,area,name)
group by cube(prov,city,area) 
;

5、Grouping__ID、grouping() 的使用场景

功能说明:

        可以用来判断分组字段是否参与聚合,下面为 Grouping__ID 、grouping() 计算逻辑

使用场景:

        当使用 grouping sets、with rollup、with cube进行聚合时,对不参与聚合的字段会使用null进行填充,这就导致查询结果中分组字段为null时,无法区分是填充的null还是分组字段本身的null

        遇到上述情况,可以使用下面两种解决方式

                1、将分组字段中的null进行替换处理,比如9999、other、其他

                2、使用 Grouping__ID 或者 grouping() 进行区分


6、使用 增强聚合 会不会对查询性能有提升呢?

测试用例-grouping sets:

-- TODO 必须开区map端合并
set hive.map.aggr=true;
SELECT prov,city,area,count(1),grouping__id
FROM (select '河北省' as prov,'石家庄市' as city,'新华区' as area,'张1' as name union all 
      select '河北省','石家庄市','新华区','张2' union all 
      select '河南省','新乡市','中华区','张6') AS person_info_df
group by prov,city,area grouping sets (
    (prov,city,area),
    (prov,city),
    (prov)
)
;

测试用例-group by + union all:

set hive.map.aggr=true;
SELECT prov,city,area,count(1)
FROM (select '河北省' as prov,'石家庄市' as city,'新华区' as area,'张1' as name union all 
      select '河北省','石家庄市','新华区','张2' union all 
      select '河南省','新乡市','中华区','张6'
) AS person_info_df
group by prov,city,area

union all 

SELECT prov,city,null as area,count(1)
FROM (select '河北省' as prov,'石家庄市' as city,'新华区' as area,'张1' as name union all 
      select '河北省','石家庄市','新华区','张2' union all 
      select '河南省','新乡市','中华区','张6') AS person_info_df
group by prov,city

union all 

SELECT prov,null as city,null as area,count(1)
FROM (select '河北省' as prov,'石家庄市' as city,'新华区' as area,'张1' as name union all 
      select '河北省','石家庄市','新华区','张2' union all 
      select '河南省','新乡市','中华区','张6') AS person_info_df
group by prov

对比执行计划:

对比运行时长:

结论:

通过上面执行计划和运行时长的对比,使用 grouping sets、with cube、with rollup 确实比

group by + union all 方式的性能要好,因为 增强group by避免了多次读取底表,降低生成

job的个数,从而减轻了磁盘和网络I/O时的压力。


7、对grouping sets、with cube、with rollup 的优化

由于在使用增强group by时,会在同一个job中完成多种维度组合的聚合(2的N次方),当底表数据量太大 或 维度过多时,可能造成计算资源不够而导致任务失败。

在 Hive中可以使用 set hive.new.job.grouping.set.cardinality=30 来对job进行拆分。

参数说明:

验证SQL-实验组:

验证SQL-对照组:

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

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

相关文章

2023年中国航空装备行业研究报告

第一章 行业概况 1.1 定义和分类 航空装备行业是现代工业的重要组成部分,涵盖了飞机、航空发动机以及航空设备与系统三大核心领域。这些领域不仅在技术上高度复杂,而且在国家经济、社会发展和国家安全方面都具有至关重要的作用。 首先,飞机…

​ 生产者消费者问题(条件变量 互斥锁)

本篇文章对生产者消费者(模型)问题进行了详解。其中给出了基于阻塞队列的生产者消费者模型demo代码和对涉及到的条件变量与互斥锁的操作也进行了详细解释。解释了条件变量等待时,为什么还需要一把锁的问题。对生产者消费者(模型&a…

六、展示信息添加 animation 动态效果

简介 给每个信息组件内容添加动画效果,通过 animation 来怎么增强用户浏览时的交互体验。欢迎访问个人的简历网站预览效果 本章涉及修改与新增的文件:App.vue、main.ts、first.vue 、second.vue、third.vue 、fourth.vue 、fifth.vue 一、安装 animae 插件 先安装 animate…

【ELK】日志系统部署

一、ELK日志分析系统 1、ELK的组成 ElasticSearchLogStashKibana ELK基于这三个开源日志的收集、存储、检索和可视化的解决方案;可帮助用户快速定位和分析应用程序的故障,监控应用程序性能和安全,以及提供丰富的数据分析和展示功能。 2、完…

Word 自动编号从10 以后编号后面的空白很大

目录 1、打开Word,选中需要修改的行。 2、点击鼠标右键,选择调整列表缩进一项,弹出对话框。 3、弹出对话窗口里将编号之后里面的选项,改成不特别标注。 4、点击确定,可以看到效果。 多余的缩进已经没有了。至此&…

从零开始搭建java web springboot Eclipse MyBatis jsp mysql开发环境

文章目录 1 第一步软件安装1.1 下载并安装Eclipse1.2 下载并安装Java1.3 下载并安装Apache Maven1.4 下载并安装MySQL 2 创建所需要的表和数据3 创建Maven 工程、修改jdk4 通过pom.xml获取所需要的jar包5 安装Eclipse的MyBatis插件6 创建文件夹以及jsp文件7 创建下面各种java类…

没有炫光的台灯有哪些?无眩光灯具推荐

很多家长有时候会说孩子觉得家里的台灯灯光刺眼,看书看久了就不舒服。这不仅要看光线亮度是否柔和,还要考虑台灯是不是有做遮光式设计。没有遮光式设计的台灯,光源外露,灯光会直射孩子头部,孩子视线较低,很…

掌握Katalon Studio 导入 swagger 接口文档,接口测试效率提升100%

katalon studio大家都已经不陌生了,是一款现在非常主流的自动化测试工具,包括了web、api、APP,甚至PC应用程序都可以使用它来完成自动化测试。 swagger是一款RESTFUL接口的文档在线自动生成软件,swagger是一个规范和完整的框架&a…

Python 基于人脸识别的实验室智能门禁系统的设计,附可视化界面

1 简介 本基于人脸识别的实验室智能门禁系统通过大数据和信息化的技术实现了门禁管理流程的信息化的管理操作。平台的前台页面通过简洁的平台页面设计和功能结构的分区更好的提高用户的使用体验,没有过多的多余的功能,把所有的功能操作都整合在功能操作…

物理内存分配

目录 内核物理内存分配接口 内存分配行为(物理上) 内存分配的行为操作 内存 三个水位线 水线计算 水位线影响内存分配行为 内存分配核心__alloc_pages 释放页 1、内核物理内存分配接口 struct page *alloc_pages(gfp_t gfp, unsigned int ord…

【go语言基础】go类型断言 type switch + case,t := x.(type)

有这么一个场景,当你在和用户对接的时候,调取第三方接口,但是第三方接口的时常变化的,比如从string类型变为int,这个时候你需要再去判断类型,获取第三方接口的参数。比较麻烦。 针对这一场景,g…

爬虫工具篇-ProxyBroker-代理IP管理

前言 随着互联网的不断发展,大量的信息和数据都被存储在各种不同的网站上。为了获取这些信息和数据,我们经常需要使用爬虫工具来自动化地从网站上抓取数据。然而,在一些情况下,网站可能会采取一些反爬虫措施,例如向IP…

AG35学习笔记(一):debug串口抓取模组log、debug串口测试AT指令、echo命令通过串口发送16进制数据

目录 一、概述二、抓取模组log2.1 硬件接口2.2 用户登录2.3 相关指令 三、测试AT指令3.1 查看端口3.2 进入模式 四、串口发16进制echo使用 一、概述 二、抓取模组log 在之前记录了通过USB,使用移远工具Qwinlog来抓取log(3.3 抓取模组log)。…

21天学会C++:Day11----运算符重载

CSDN的uu们&#xff0c;大家好。这里是C入门的第十一讲。 座右铭&#xff1a;前路坎坷&#xff0c;披荆斩棘&#xff0c;扶摇直上。 博客主页&#xff1a; 姬如祎 收录专栏&#xff1a;C专题 目录 1. 知识引入 2. 运算符重载 2.1 operator<() 2.2 operator() 2.3 o…

上市公司的公众环境关注度(2011-2022年)

随着互联网的普及&#xff0c;公众越来越多地通过互联网表达看法。国内外一些学者在研究中采用Google搜索引擎搜索功能构建指标&#xff0c;表达公众需求和关注程度(Kahn & Kotchen, 2011; Choi & Varian, 2012; 郑思齐等&#xff0c; 2013) 百度搜索在中国内地的市场占…

高速、低功耗模拟开关芯片 MS703D

MS703D 是一款高速、低功耗模拟开关芯片&#xff0c;其工作电压范围 是 1.8 至 5.5V 。其具有低码间偏移、高通道噪声隔离度以及大带 宽特性。 主要应用范围包括&#xff1a;手持设备和消费电子&#xff0c;如手机、数码相 机、笔记本电脑等。 主要特点  3V 下导通电…

开源日报 0824 | 构建UI组件和页面的前端工作坊

Storybook 是一个用于构建 UI 组件和页面的前端工作坊&#xff0c;支持多种主流框架&#xff0c;提供丰富的插件&#xff0c;具有可配置性强和扩展性好的特点。 storybookjs/storybook Stars: 79.9k License: MIT Storybook 是一个用于构建 UI 组件和页面的前端工作坊&#x…

px to rem rpx vw中文文档 |px自动转换rem插件

【px to rem & rpx & vw】项目地址&#xff1a; https://github.com/cipchk/vscode-cssrem/blob/HEAD/README.zh-CN.md 作者&#xff1a;卡色-cipchk https://github.com/cipchk cssrem 一个 px 与 rem 单位互转的 VSCode 插件&#xff0c;且支持WXSS微信小程序。 特性…

成集云 | 金蝶EAS与旺店通ERP集成(旺店通主管库存)| 解决方案

源系统成集云目标系统 方案介绍 金蝶EAS是一款全球首款融合TOGAF标准SOA架构的企业管理软件&#xff0c;专门为大中型企业设计&#xff0c;以“创造无边界信息流”为产品设计理念&#xff0c;支持云计算、SOA和动态流程管理的整合技术平台。 旺店通ERP系统是一款专…

API(十)时间相关的SDK

一 时间相关的SDK ① 时间记录的必要性 1、案发现场的时间点2、通过时间判断性能3、时间的不准确性,日志落盘时间 --> 缓冲区导致延迟 ② 使用哪些日期和时间的函数 1、lua 标准时间函数,函数 os.time、os.date 和 os.difftime 提供了所有日期和时间2、在 openresty…