hive通过grouping sets多维度组合去重统计避免使用distinct
在hive中,如果遇到多维度组合统计,并且要进行去重统计,例如统计不同维度组合的访问用户数,比如统计运营商、手机品牌、网络类型的用户数,怎样避免不用ditinct(因为distinct效率低),并且grouping__id和以前维度组合保持一致呢?
select * from temp.temp_active_user_info t limit 10;
实现方法一:通过grouping sets和distinct进行统计
select grouping__id as group_id, nvl(phone_brand, '剔重汇总') phone_brand, nvl(network_type, '剔重汇总') network_type, nvl(provider_name, '剔重汇总') provider_name, count(distinct user_id) user_numfrom temp.temp_active_user_info tgroup by phone_brand, --1network_type, --2provider_name --4
grouping sets ((phone_brand), --1(network_type, provider_name) --6
);
统计结果
实现方法二:通过grouping sets将user_id加入维度组合再进行group by统计
select group_id, phone_brand, network_type, provider_name, count(1) user_numfrom (select cast(grouping__id as bigint)&7 as group_id,--一定要先将grouping__id转换为数值类型 nvl(phone_brand, '剔重汇总') phone_brand, nvl(network_type, '剔重汇总') network_type, nvl(provider_name, '剔重汇总') provider_name, user_idfrom temp.temp_active_user_info tgroup by phone_brand, --1network_type, --2provider_name, --4user_id --8grouping sets ((phone_brand, user_id), --9&7=1(network_type, provider_name, user_id) --14&7=6)) tgroup by group_id, phone_brand, network_type, provider_name
;
统计结果:
注意:
- 先将grouping__id转换为数值类型
- &前后不能有空格
- &后的数字为去重字段的位置数减去1,例如上面的SQL语句种user_id的位置数为8,那&后紧跟7
通过实践证明,两种统计方法结果一样,并且grouping__id也一样,但第二种方法避免了distinct的出现,当数据量特别大时会感觉到方法二执行效率和占用资源明显优于方法一
hive通过grouping sets多维度组合去重统计避免使用distinct相关推荐
- Hive之grouping sets用法详解
目录 关键字: 简单示例: 实例一: presto中grouping sets函数 关键字: GROUPING SETS: 根据不同的维度组合进行聚合,等价于将不同维度的GROUP BY结果集进行UN ...
- hive 多维分析 GROUPING SETS
GROUPING SETS 1.含义: GROUPING SETS 允许在一个数据结果集中包含多个 GROUP BY 结果集,即进行多维分析. GROUPING SET 可由 UNION 连接的几个 ...
- presto和hive中grouping sets的格式不一致问题
背景 遇到的问题,在presto中使用hive中的grouping sets报错 报错信息如下 [1] Query failed (#20220811_003524_00009_hzxre): lin ...
- flink GROUPING SETS多维度聚合、设置Table state 到期时间
文章目录 1. GROUPING SETS 2. TTL 1. GROUPING SETS 在一个GROUP BY 查询中,根据不同的维度组合进行聚合.GROUPING SETS就是一种将多个GR ...
- 【Hive】grouping sets() 函数
文章目录 1. 语法 2. 例子 1. 语法 grouping sets()函数是一种将多个group by逻辑写在一个sql语句中的便利写法. 等价于将不同维度的GROUP BY结果集进行UNION ...
- grouping sets函数
grouping sets: 根据不同的维度组合进行聚合,等价于将不同维度的group by结果集进行union all grouping__id(请注意函数名中的下划线是两个!):表示结果属于哪一个 ...
- Hive分析窗口函数(五) GROUPING SETS,GROUPING__ID,CUBE,ROLLUP
GROUPING SETS 该关键字可以实现同一数据集的多重group by操作.事实上GROUPING SETS是多个GROUP BY进行UNION ALL操作的简单表达,它仅仅使用一个stage完 ...
- 大数据之hive:hive新功能之GROUPING SETS,Cube, Rollup
目录 一.GROUPING SETS 1.概述 2.实战 二.Cube 1.概述 2.实战 三.Rollup 1.概述 2.实战 四.Grouping_ID函数 一.GROUPING SETS 1.概 ...
- Hive函数:GROUPING SETS,GROUPING__ID,CUBE,ROLLUP
参考:lxw大数据田地:http://lxw1234.com/archives/2015/04/193.htm 数据准备: CREATE EXTERNAL TABLE test_data ( mont ...
最新文章
- fedora mysql 客户端_fedora mysql 安装
- 10分钟出一个块的BCH,可以作为日常支付?
- 在等于操作中无法解决“SQL_Latin1_General_CP1_CI_AS”和“Latin1_General_CI_AS”之间的排序规则冲突
- ElasticSearch 条件更新 删除
- PE学习(九)第九章:TLS 动态TLS与静态TLS
- MPI编程的常用接口速查
- Thinkphp3.2.3打印上一句执行的sql语句
- c# 获取word表格中的内容_Java 获取、删除Word文本框中的表格
- Symbian中不能跨越线程(RThread)使用的对象/组件(RSocket/Memery Heap,etc)
- sed的选项与命令简要
- IBM SPSS Statistics定义变量使用介绍
- Marxan模型保护区优化与保护空缺甄选技术、InVEST生态系统中的应用
- dubbo之failed to connect to server /xx.xx.xx.xx:20880 client-side timeout问题解决
- python list切片_python list切片
- JavaEE程序猿的Java世界观⑤
- java 树形图_java实现树状图
- databasedt
- 软件架构中的层次依赖
- 理论详解:为什么 MySQL 采用B+树作为索引?
- 唤醒词检测引擎Snowboy