HiveSQL、SparkSQL数据倾斜优化示例(groupby没有count(distinct)的场景)

本文解析了Hive 3.0及以上版本和Spark 2.x中groupby操作的优化技巧,重点介绍了随机数双重聚合方法和使用skewindata参数。通过实例演示了如何通过加入随机数和配置参数来改善查询效率。
摘要由CSDN通过智能技术生成

更多的场景示例请点击:https://blog.csdn.net/SKY_02/article/details/113394634

  • 当前一些版本SQL引擎(Hive3.0以上、Spark2.X),group by的优化做得已经很好了,基本不怎么需要额外优化,以下可当作是优化原理解析。
  • 两种方法原理相近,都是通过随机数把key尽可能均匀分摊到不同的分区中,通过多次的操作完成聚合。
  1. 随机数双重聚合
    给原group by的列加上cast(rand() * N as int)进行第一次聚合,然后对子查询再做一次聚合
  2. HiveSQL加参数:set hive.groupby.skewindata=true;
-- 示例前提(后面的示例会重新设置为true)
set hive.groupby.skewindata=false;

-- 原逻辑
select
     t.col_a
    ,count(1) as cnt
    ,sum(t.amount) as cnt
from test.test_table_1 t
group by t.col_a
;


-- 解法1-随机数双重聚合
select
     m2.col_a
    ,sum(m2.cnt) as cnt
    ,sum(m2.amount) as cnt
from
(
    select
         m1.rand_num
        ,m1.col_a
        ,count(1) as cnt
        ,sum(m1.amount) as cnt
    (
        select
             cast(rand() * 100 as int) as rand_num
            ,t.col_a
            ,t.amount
        from test.test_table_1 t
    ) m1
    group by m1.col_a
            ,m1.rand_num
) m2
group by m2.col_a
;


-- 解法2-加参数
set hive.groupby.skewindata=true;

select
     t.col_a
    ,count(1) as cnt
    ,sum(t.amount) as cnt
from test.test_table_1 t
group by t.col_a
;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值