首页 > 其他分享 >hive性能优化系列-distinct-有限key

hive性能优化系列-distinct-有限key

时间:2024-06-07 14:12:04浏览次数:10  
标签:Map key 方式 distinct age hive 数据量 数据

案例

方式1

使用group by
select s_age,count(1) from( select s_age from student_tb_orc group by s_age ) b

方式2

使用distinct
select s_age,count(distinct s_age) from student_tb_orc

分析

数据量特别大

方式1的代码在数据量特别大的情况下能够有效避免 Reduce 端的数据倾斜,此时可能会比案例方式2效率高。

采用方式1的写法,什么时候会比方式方式2高呢?
在有数据倾斜的情况下,案例1 的方式会比方式方式2更优。什么是数据倾斜?是指当所需处理的数据量级较大时某个类型的节点所需要处理的数据量级,大于同类型的节点个数量级 (10 倍) 以上这里的某个类型的节点可以指代执行 Map 或者 Reduce 的节点当数据大到一定的量级时,方式1 有两个作业,可以把处理逻辑分散到两个阶段中,即第一个阶段先处理一部分数据,缩小数据量,第二个阶段在已经缩小的数据集上继续处理。
而方式方式2,经过 Map 阶段处理的数据还非常多时,所有的数据却都需要交给个 Reduce 节点去处理,就好比千军万马过独木桥一样,不仅无法利用到分布式集群的优势,还要浪费大量时间在等待,而这个等待的时间远比方式1 多个 MapReduce 所延的流程导致额外花费的时间还多

数据量小/key明显有限

我们先不管数据量特别大这个问题,就当前的业务和环境下,方式2 一定会比方式1 的效率高,原因有以下几点:

  1. 进行去重的列是 s_age 列,它的业务含义表示年龄。既然是年龄,说明它的可枚举值非常有限,如果转化成 MapReduce 来解释的话,在 Map 阶段,每个 Map 会对 s_age去重。由于 s_age 枚举值有限,因而每个 Map 得到的 s_age 也有限,最终得到 reduce 的数据量也就是 map 数量s_age 举值的个数。假如执行方式1的代码 Map 的数量有 100个s_age 的最大举值有 100个每个Map 过滤后的数据都含有 s_age 的所有举值且s_age是int型4个字节,那么传输到 Reduce 的数据量就是 10000 条记录,总数据量是 40KB,这么小的数据量,不需要避免数据倾斜。假如执行方式1的代码 Map 的数量有 100个 s_age 的最大举值有 100个每个Map 过滤后的数据都含有 s_age 的所有举值且s_age是int型4个字节,那么传输到 Reduce 的数据量就是 10000 条记录,总数据量是 40KB,这么小的数据量,不需要避免数据倾斜。

  2. 方式2 中,distinct 的命令会在内存中构建一个 hashtable,查找去重的时间复杂度是 0(1);
    方式1中,group by 在不同版本间变动比较大,有的版本会用构建 hashtable 的形式去重,有的版本会通过排序的方式,排序最优时间复杂度无法到 O(1)。另外,方式1会转化为两个任务,会消耗更多的磁盘网络I/O资源。

  3. 最新的 Hive 3.0 中新增了 count (distinct)优化,通过配置 hive.optimize.countdistinct,即使真的出现数据倾斜也可以自动优化,自动改变SOL执行的逻辑。

  4. 方式2 比方式1 代码简洁,表达的意思简单明了,如果没有特殊的问题代码简洁就是优。

标签:Map,key,方式,distinct,age,hive,数据量,数据
From: https://www.cnblogs.com/qingyun-log/p/18237052

相关文章

  • Spark读取http数据写入hive
    http请求hutool,json转换数据写入到rdd,之后转换为sparksqlSparkSessionspark=SparkSession.builder().master("yarn").appName("json2hive").config("hive.exec.dynamic.partition","true").config("......
  • Python - Django - MySQL #need to add distinct() after select_related().distinct(
    所以这是ads/views.py还有ads/models.py、ads/forms、ads/urls.py和其他文件,但评分器抱怨的是这个views.py...检索到3806个HTML字符测试已完成:在页面顶部发现菜单栏搜索"HHGTTG_421717639962"时发现多个广告。您可能需要在views.py中的select_related().di......
  • Hive3.1.2概述与基本操作
    、Hive基本概念1.1 Hive简介Hive本质是将SQL转换为MapReduce的任务进行运算,底层由HDFS来提供数据存储,说白了hive可以理解为一个将SQL转换为MapReduce的任务的工具,甚至更近一步说hive就是一个MapReduce客户端。为什么使用Hive?如果直接使用hadoop的话,人员学习成本太高,项目要......
  • Hive3.1.2分区与排序(内置函数)
    1、Hive分区(十分重要!!)分区的目的:避免全表扫描,加快查询速度!在大数据中,最常见的一种思想就是分治,我们可以把大的文件切割划分成一个个的小的文件,这样每次操作一个个小的文件就会很容易了,同样的道理,在hive当中也是支持这种思想的,就是我们可以把大的数据,按照每天或者每小时切分......
  • hive-3.1.2分布式搭建
    hive-3.1.2分布式搭建文档谷歌浏览器下载网址:GoogleChrome–Downloadthefast,securebrowserfromGoogle华为云镜像站:https://mirrors.huaweicloud.com/home1、上传解压配置环境变量#1、解压tar-zxvfapache-hive-3.1.2-bin.tar.gz-C/usr/local/s......
  • hive概述与基础操作
    Hive3.1.2概述与基本操作(此笔记使用MD文档写的,可直接复制到MD中,方便查看)1、Hive基本概念1.1 Hive简介Hive本质是将SQL转换为MapReduce的任务进行运算,底层由HDFS来提供数据存储,说白了hive可以理解为一个将SQL转换为MapReduce的任务的工具,甚至更近一步说hive就是一个MapReduce......
  • 最新OpenAI免费API-openai api key获取方式
    最近又开始准备LLM应用开发,要用到apikey,才发现过我之前免费发放的额度没了!我都没咋用过,痛心......
  • [email protected]: Permission denied (publickey)
    输入ssh-keygen-trsa-C"[email protected]"   [email protected]的邮箱 一直回车,直到看到  然后到这个路径下打开文件  将里面的内容复制到git帐号的ssh中 ......
  • 阿里云OSS对象存储怎么开通?怎么设置APIAccessKey申请教程?
    阿里云OSS对象存储怎么开通?怎么设置APIAccessKey申请教程?阿里云的产品线众多,后台功能复杂,聚搜云有时候找一些产品或者功能的时候,也是找的云里雾里。比如聚搜云这次需要用到阿里云OSS,我们都知道国内的带宽是小水管,如果用来常规的建站用途,其实也没什么大问题,但是如果静态资源......
  • 33、nginx-CA和https(http+ssl(安全套接字))私有CA--网站加密(443 ssl https)-加密密钥key
    算法:将原有的值通过一些算法来进行加密对称算法(加密和解密的过程用的钥匙是相同的):AES\DES\3DES非对称算法(加密和解密的过程中使用的钥匙是不一样的):DH\RSAhash算法:MD5=========================================SSL安全套接字===================================......