IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> grouping_id&grouping sets -> 正文阅读

[大数据]grouping_id&grouping sets

grouping sets 用法
在Hive中,会出现对同一个数据表进行不同粒度的汇总,这时可以有两种方案:

用多个sql,对不同粒度使用不同的 group by 方法。
用1个sql,使用 grouping sets 方法一次性得到所有粒度的汇总。
以测试数据表 tmp_student 为例:

1、生成测试数据

在 hive 环境中创建临时表:

create table tmp.tmp_student
(
   name string,
   class int,
   sex string,
   score int
)
row format delimited fields terminated by '|';

然后加载测试数据:

load data local inpath 'text.txt' into table tmp_student;

其中,text.txt 内容如下:

A|3|男|45
B|3|女|55
C|2|女|74
D|3|男|90
E|1|男|80
F|2|女|92
G|1|女|95
H|1|男|95
I|3|女|99
J|3|男|99

查看是否加载成功:

hive> select * from tmp_student;
OK
A	345
B	355
C	274
D	390
E	180
F	292
G	195
H	195
I	399
J	399
Time taken: 0.377 seconds, Fetched: 10 row(s)

2、grouping sets示例

数据表有4个字段:姓名、班级、性别、分数。
如果我想按照以下3个粒度汇总:
1、每个班级的平均分数
2、每个性别的平均分数
3、每个班级下不同性别的平均分数
则使用多个sql分别汇总的方案为:

select class, avg(score) from tmp.tmp_student group by class;
select sex, avg(score) from tmp.tmp_student group by sex;
select class, sex, avg(score) from tmp.tmp_student group by class, sex;

而使用1个sql使用grouping sets的方案为:

select
    grouping__id, -- 内置变量,只要使用grouping sets就可以调用
    class,
    sex,
    avg(score) as avg_score
from
    tmp.tmp_student
group by
    class,
    sex 
grouping sets(
    class, 
    sex,
    (class, sex)
) order by 
    grouping__id

此处结果和原文章不同(https://blog.csdn.net/HappyRocking/article/details/106545559)

结果为:

OK
0       378.0
0       377.0
0       283.0
0       187.5
0       195.0
1       3       NULL    77.6
1       2       NULL    83.0
1       1       NULL    90.0
2       NULL81.8
2       NULL83.0

可以看到,使用 grouping sets 同时汇总出了 3 种不同粒度的平均分数。
注意:
1、grouping sets 只能用于 group by 之后。
2、grouping sets 中可以包含多种粒度,粒度之间用逗号连接。
3、grouping sets 中的所有字段,都必须出现在 group by 中,相当于 group by 后面的字段是最细粒度。
4、如果 select 中的字段,没有包含在某个 grouping set 中,那么这个粒度下的这个字段值为 NULL。
4、不同的粒度,可以使用内置变量 grouping__id 进行区分。

本文重点:

3、grouping_id计算方法

grouping sets 中的每一种粒度,都对应唯一的 grouping__id 值,其计算公式与 group by 的顺序、当前粒度的字段有关。
具体计算方法如下:

① 将 group by 的所有字段 倒序 排列。
② 对于每个字段,如果该字段出现在了当前粒度中,则该字段位置赋值为0,否则为1。
③ 这样就形成了一个二进制数,这个二进制数转为十进制,即为当前粒度对应的 grouping__id。

以上述对 tmp_student 的3种粒度的统计结果为例:

序号grouping set给排列的字段(sex class)为null的赋值对应的十进制(grouping__id 的值)
1class011
2sex102
3class,sex000

4、再验证

新增name 维度

select
    grouping__id, -- 内置变量,只要使用grouping sets就可以调用
    name ,
    class,
    sex,
    avg(score) as avg_score
from
    tmp.tmp_student
group by
    name ,
    sex ,
    class
grouping sets(
    name ,
    class,
    sex,
    (class, sex),
    (name, sex)
) order by
    grouping__id
;

结果:

1       E       NULL80.0
1       G       NULL95.0
1       D       NULL90.0
1       H       NULL95.0
1       C       NULL74.0
1       J       NULL99.0
1       B       NULL55.0
1       F       NULL92.0
1       A       NULL45.0
1       I       NULL99.0
3       C       NULL    NULL    74.0
3       J       NULL    NULL    99.0
3       I       NULL    NULL    99.0
3       H       NULL    NULL    95.0
3       G       NULL    NULL    95.0
3       F       NULL    NULL    92.0
3       E       NULL    NULL    80.0
3       D       NULL    NULL    90.0
3       B       NULL    NULL    55.0
3       A       NULL    NULL    45.0
4       NULL    378.0
4       NULL    187.5
4       NULL    377.0
4       NULL    283.0
4       NULL    195.0
5       NULL    NULL81.8
5       NULL    NULL83.0
6       NULL    3       NULL    77.6
6       NULL    2       NULL    83.0
6       NULL    1       NULL    90.0
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 11:22:43  更:2022-09-13 11:26:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:32:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码