Hive之count(distinct xxx)优化写法

简介: 笔记

先看一道某互联网公司的面试题:

题目描述

计算每个省份的买家数的sq代码如下:

select
    province 
    ,count(distinct buyer_id)
from orders
where dt = '20211012'
group by province

假设 orders表很大,每天有5千万订单,这个代码会有哪些问题,应该如何处理或者改写代码?


解答:这种写法逻辑上没问题,而它的底层引擎是mapreduce,是分布式计算的,但是在实际业务中如果数据量过大,相同重复的key过多的情况,所以自然会出现数据倾斜这种分布式计算的典型问题,这可能会导致某一个reduce处理的时间过长,如果换成这样的写法:

select
    count(distinct buyer_id)
from orders
where dt = '20211012'

那么只有1个reduce,那么处理的时间会更长。

Distinct的执行原理是:将需要去重的字段以及group by 字段联合作为 key 将数据分发到 Reduce 端。

解决方案:所以对于这种去重统计,如果在数据量够大,我会采用count加group by去进行统计:

select 
    province
    ,count(1)
from 
(
    select
        province 
        ,buyer_id
    from orders
    where dt = '20211012'
    group by province,buyer_id
)
group by province

先对数据进行去重减少数据量,再做count聚合,这一定程度上减少了数据量,从而减少了数据倾斜的可能性。

总结:在数据量很大的情况下,使用count+group by替换count(distinct)能使作业执行效率和速度得到很大的提升,一般来说数据量越大提升效果越明显。


相关文章
|
2天前
|
SQL 存储 分布式计算
Hive数据仓库设计与优化策略:面试经验与必备知识点解析
本文深入探讨了Hive数据仓库设计原则(分区、分桶、存储格式选择)与优化策略(SQL优化、内置优化器、统计信息、配置参数调整),并分享了面试经验及常见问题,如Hive与RDBMS的区别、实际项目应用和与其他组件的集成。通过代码样例,帮助读者掌握Hive核心技术,为面试做好充分准备。
|
8月前
|
SQL 分布式计算 监控
Hive性能优化之计算Job执行优化 2
Hive性能优化之计算Job执行优化
108 1
|
8月前
|
SQL 存储 分布式计算
Hive性能优化之表设计优化1
Hive性能优化之表设计优化1
40 1
|
2天前
|
SQL 存储 大数据
Hive的查询、数据加载和交换、聚合、排序、优化
Hive的查询、数据加载和交换、聚合、排序、优化
31 2
|
2天前
|
SQL 分布式计算 资源调度
Hive 优化总结
Hive优化主要涉及HDFS和MapReduce的使用。问题包括数据倾斜、操作过多和不当使用。识别倾斜可通过检查分区文件大小或执行聚合抽样。解决方案包括整体优化模型设计,如星型、雪花模型,合理分区和分桶,以及压缩。内存管理需调整mapred和yarn参数。倾斜数据处理通过选择均衡连接键、使用map join和combiner。控制Mapper和Reducer数量以避免小文件和资源浪费。减少数据规模可调整存储格式和压缩,动态或静态分区管理,以及优化CBO和执行引擎设置。其他策略包括JVM重用、本地化运算和LLAP缓存。
27 4
Hive 优化总结
|
2天前
|
SQL 存储 分布式计算
【Hive】Hive优化有哪些?
【4月更文挑战第16天】【Hive】Hive优化有哪些?
|
2天前
|
SQL 分布式计算 Hadoop
Hive SQL 优化
Hive SQL 优化
52 1
|
8月前
|
SQL 分布式计算 资源调度
Hive性能优化之计算Job执行优化 1
Hive性能优化之计算Job执行优化
100 0
Hive性能优化之计算Job执行优化 1
|
8月前
|
SQL 存储 分布式计算
Hive性能优化之表设计优化2
Hive性能优化之表设计优化2
55 1
|
10月前
|
SQL 分布式数据库 HIVE
Hive 优化
Hive 优化
64 0

热门文章

最新文章