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)能使作业执行效率和速度得到很大的提升,一般来说数据量越大提升效果越明显。


相关文章
|
3月前
|
SQL 存储 分布式计算
Hive数据仓库设计与优化策略:面试经验与必备知识点解析
本文深入探讨了Hive数据仓库设计原则(分区、分桶、存储格式选择)与优化策略(SQL优化、内置优化器、统计信息、配置参数调整),并分享了面试经验及常见问题,如Hive与RDBMS的区别、实际项目应用和与其他组件的集成。通过代码样例,帮助读者掌握Hive核心技术,为面试做好充分准备。
|
11月前
|
SQL 分布式计算 监控
Hive性能优化之计算Job执行优化 2
Hive性能优化之计算Job执行优化
196 1
|
11月前
|
SQL 存储 分布式计算
Hive性能优化之表设计优化1
Hive性能优化之表设计优化1
59 1
|
3月前
|
SQL 分布式计算 资源调度
Hive 优化总结
Hive优化主要涉及HDFS和MapReduce的使用。问题包括数据倾斜、操作过多和不当使用。识别倾斜可通过检查分区文件大小或执行聚合抽样。解决方案包括整体优化模型设计,如星型、雪花模型,合理分区和分桶,以及压缩。内存管理需调整mapred和yarn参数。倾斜数据处理通过选择均衡连接键、使用map join和combiner。控制Mapper和Reducer数量以避免小文件和资源浪费。减少数据规模可调整存储格式和压缩,动态或静态分区管理,以及优化CBO和执行引擎设置。其他策略包括JVM重用、本地化运算和LLAP缓存。
48 4
Hive 优化总结
|
2月前
|
SQL 资源调度 数据库连接
Hive怎么调整优化Tez引擎的查询?在Tez上优化Hive查询的指南
在Tez上优化Hive查询,包括配置参数调整、理解并行化机制以及容器管理。关键步骤包括YARN调度器配置、安全阀设置、识别性能瓶颈(如mapper/reducer任务和连接操作),理解Tez如何动态调整mapper和reducer数量。例如,`tez.grouping.max-size` 影响mapper数量,`hive.exec.reducers.bytes.per.reducer` 控制reducer数量。调整并发和容器复用参数如`hive.server2.tez.sessions.per.default.queue` 和 `tez.am.container.reuse.enabled`
49 0
|
3月前
|
SQL 存储 大数据
Hive的查询、数据加载和交换、聚合、排序、优化
Hive的查询、数据加载和交换、聚合、排序、优化
82 2
|
3月前
|
SQL 分布式计算 资源调度
一文看懂 Hive 优化大全(参数配置、语法优化)
以下是对提供的内容的摘要,总长度为240个字符: 在Hadoop集群中,服务器环境包括3台机器,分别运行不同的服务,如NodeManager、DataNode、NameNode等。集群组件版本包括jdk 1.8、mysql 5.7、hadoop 3.1.3和hive 3.1.2。文章讨论了YARN的配置优化,如`yarn.nodemanager.resource.memory-mb`、`yarn.nodemanager.vmem-check-enabled`和`hive.map.aggr`等参数,以及Map-Side聚合优化、Map Join和Bucket Map Join。
|
3月前
|
SQL 存储 分布式计算
【Hive】Hive优化有哪些?
【4月更文挑战第16天】【Hive】Hive优化有哪些?
|
3月前
|
SQL 分布式计算 Hadoop
Hive SQL 优化
Hive SQL 优化
75 1
|
3月前
|
SQL 存储 关系型数据库
Presto【实践 01】Presto查询性能优化(数据存储+SQL优化+无缝替换Hive表+注意事项)及9个实践问题分享
Presto【实践 01】Presto查询性能优化(数据存储+SQL优化+无缝替换Hive表+注意事项)及9个实践问题分享
370 0