(12)Hive调优——count distinct去重优化

这篇具有很好参考价值的文章主要介绍了(12)Hive调优——count distinct去重优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

   离线数仓开发过程中经常会对数据去重后聚合统计,count distinct使得map端无法预聚合,容易引发reduce端长尾,以下是count distinct去重调优的几种方式。

解决方案一:group by 替代

原sql 如下:

#=====7日、14日的app点击的用户数(user_id去重统计)
select
    group_id,
    app_id,
-- 7日内UV
    count(distinct case when dt >= '${7d_before}' then user_id else null end)  as 7d_uv, 
--14日内UV
    count(distinct case when dt >= '${14d_before}' then user_id else null end) as 14d_uv 
from tbl
where dt >= '${14d_before}'
group by group_id, --渠道
         app_id;  --app

优化思路:group by两阶段聚合

#=====7日、14日的app点击的用户数(user_id去重统计)
select
    group_id,
    app_id,
-- 7日内UV
    sum(case when 7d_cnt > 0 then 1 else 0 end) as 7d_uv,
--14日内UV
    sum(case when 14d_uv > 0 then 1 else 0 end) as 14d_uv

from (select
          group_id,
          app_id,
          -- 7日内各渠道各app下的每个用户的点击量
          count(case when dt >= '${7d_before}' then user_id else null end)  as 7d_cnt,
          -- 14日内各渠道各app下的每个用户点击量
          count(case when dt >= '${14d_before}' then user_id else null end) as 14d_uv
      from tbl
      where dt >= '${14d_before}'
      group by group_id,
               app_id,
               user_id) tmp1
group by group_id,
         app_id;

方案一弊端:数据倾斜风险

  解决方案一通过两阶段group by(分组聚合) 对count (distinct) 进行改造调优,需要注意的是:如果分组字段user_id在tbl 表中存在大量的重复值,group by底层走shuffle,会有数据倾斜的风险,因此方案一还可以进一步优化。

解决方案二:group by调优

1)添加随机数,两阶段聚合(推荐)

#===============优化前
insert overwrite table tblB partition (dt = '2022-10-19')
select
    cookie_id,
    event_query,
    count(*)  as cnt
from tblA
where dt >= '20220718'
  and dt <= '20221019'
  and event_query is not null
group by cookie_id, event_query



#===============优化后
insert overwrite table tblB partition (dt = '2022-10-19')
select
    split(tkey, '_')[1] as cookie_id,
    event_query,
 #--- 求出最终的聚合值
    sum(cnt)   as cnt
from (
         select
             concat_ws('_', cast(ceiling(rand() * 99) as string), cookie_id) as tkey,
             event_query,
      #---将热点Key值:cookie_id 进行打散后,先局部聚合得到cnt
             count(*)  as cnt
         from tblA
         where dt >= '20220718'
           and dt <= '20221019'
           and event_query is not null
        #--- 第一阶段:添加[0-99]随机整数,将热点Key值:cookie_id 进行打散( M -->R)
         group by concat_ws('_', cast(ceiling(rand() * 99) as string), cookie_id),
                  event_query
     ) temp
 #--- 第二阶段:对拼接的key值进行切分,还原原本的key值split(tkey, '_')[1] =cookie_id ( R -->R)
group by split(tkey, '_')[1], event_que

 优化思路为:

  •   第一阶段:对需要聚合的Key值添加随机后缀进行打散,基于加工后的key值进行初步聚合(M-->R1)
  •   第二阶段:对加工后的key值进行切分还原,对第一阶段的聚合值进行再次聚合,求出最终结果值(R1-->R2)

2)开启Map端聚合

#--开启Map端聚合,默认为true
set hive.map.aggr = true;
#--在Map 端预先聚合操作的条数
set hive.groupby.mapaggr.checkinterval = 100000;

    该参数可以将顶层的聚合操作放在 Map 阶段执行,从而减轻shuffle清洗阶段的数据传输和 Reduce阶段的执行时间,提升总体性能。

3)数据倾斜时自动负载均衡

#---有数据倾斜的时候自动负载均衡(默认是 false)
set hive.groupby.skewindata = true;

  开启该参数后,当前程序会自动通过两个MapReduce来运行,将M->R阶段 拆解成 M->R->R阶段文章来源地址https://www.toymoban.com/news/detail-836968.html

  • 第一个MapReduce自动进行随机分布到Reducer中(负载均衡),每个Reducer做部分聚合操作,输出结果
  • 第二个MapReduce将上一步聚合的结果再按照业务(group by key)进行处理,保障相同的key分发到同一个reduce做最终聚合。

到了这里,关于(12)Hive调优——count distinct去重优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Hadoop、Spark和Hive调优优化原理

    作者:禅与计算机程序设计艺术 随着互联网和大数据的普及以及处理器性能的提升,当时的技术已经远远超过了当时能够想象的范围。这段时间MapReduce计算框架已经成为一个主流的开源计算框架,包括Hadoop、Pig、Hive、Mahout、Storm等。 2010年Apache Spark横空出世,基于内存计算框

    2024年02月06日
    浏览(43)
  • hive企业级调优策略之Join优化

    原文链接:https://blog.csdn.net/m0_52606060/article/details/135080511 本教程的计算环境为Hive on MR。计算资源的调整主要包括Yarn和MR。 Join算法概述 Hive拥有多种join算法,包括Common Join,Map Join,Bucket Map Join,Sort Merge Buckt Map Join等,下面对每种join算法做简要说明: Common Join Common Join是Hiv

    2024年01月16日
    浏览(49)
  • Hive实战:实现数据去重

    在本次实战任务中,我们利用Hive大数据处理框架对三个文本文件(ips01.txt、ips02.txt、ips03.txt)中的IP地址进行了整合与去重。首先,在虚拟机上创建了这三个文本文件,并将它们上传至HDFS的/deduplicate/input目录下作为原始数据源。接着,启动了Hive Metastore服务和客户端,以管理

    2024年01月16日
    浏览(28)
  • 【Hive_05】企业调优1(资源配置、explain、join优化)

    关于调优,重要的是理解每一个优化手段的思路。理解优化需要配置的每个参数的实际作用。 计算环境为Hive on MR。计算资源的调整主要包括Yarn和MR。 1)Yarn配置说明 需要调整的Yarn参数均与CPU、内存等资源有关,核心配置参数如下 (1)yarn.nodemanager.resource.memory-mb 该参数的含

    2024年01月22日
    浏览(41)
  • hive企业级调优策略之CBO,谓词下推等优化

    原文链接:https://blog.csdn.net/m0_52606060/article/details/135080511 本教程的计算环境为Hive on MR。计算资源的调整主要包括Yarn和MR。 优化说明 CBO是指Cost based Optimizer,即基于计算成本的优化。 在Hive中,计算成本模型考虑到了:数据的行数、CPU、本地IO、HDFS IO、网络IO等方面。Hive会计算

    2024年02月20日
    浏览(56)
  • 13.108.Spark 优化、Spark优化与hive的区别、SparkSQL启动参数调优、四川任务优化实践:执行效率提升50%以上

    13.108.Spark 优化 1.1.25.Spark优化与hive的区别 1.1.26.SparkSQL启动参数调优 1.1.27.四川任务优化实践:执行效率提升50%以上 1.1.25.Spark优化与hive的区别 先理解spark与mapreduce的本质区别,算子之间(map和reduce之间多了依赖关系判断,即宽依赖和窄依赖。) 优化的思路和hive基本一致,比较

    2024年02月10日
    浏览(50)
  • (15)Hive调优——数据倾斜的解决指南

    目录 前言 一、什么是数据倾斜 二、发生数据倾斜的表现 2.1 MapReduce任务 2.2 Spark任务 三、如何定位发生数据倾斜的代码 四、发生数据倾斜的原因 3.1 key分布不均匀 3.1.1 某些key存在大量相同值 3.1.2 存在大量异常值或空值 3.2 业务数据本身的特性 3.3 SQL语句本身就有数据倾斜

    2024年04月14日
    浏览(44)
  • 大数据开发之Hive(企业级调优)

    创建测试用例 1、建大表、小表和JOIN后表的语句 2、分别向大表和小表中导入数据 1、基本语法 2、实例操作 1)查看下面这条语句的执行计划 (1)没有生成MR任务的 (2)有生成MR任务的 2)查看详细执行计划 10.2.1 列裁剪和分区裁剪 在生产环境中,会面临列很多或者数据量很

    2024年01月18日
    浏览(41)
  • 大数据开发之Hive案例篇9-Not yet supported place for UDAF ‘count‘

    一个很简单的group by和count(*) 操作,然后居然报错了 大概是在Oracle MySQL上写SQL写习惯了,以为可以这么写。 出了问题也是不知道从何排查 后面把order by子句注释掉之后,居然就可以了,那么就是order by 后面不能跟聚合函数了 于是使用了聚合函数的别名,问题搞定 修改为如下

    2024年02月06日
    浏览(50)
  • Hive数据仓库---Hive的安装与配置

    Hive 官网地址:https://hive.apache.org/ 下载地址:http://www.apache.org/dyn/closer.cgi/hive/ 把安装文件apache-hive-3.1.2-bin.tar.gz上传到master节点的/opt/software目 录下,执行以下命令把安装文件解压到/opt/app目录中 进入/opt/app目录,为目录apache-hive-3.1.2-bin建立软件链接 即输入hive就相当于输入a

    2024年02月02日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包