热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

hiveSQL优化

本文主要介绍关于hive,hadoop,sql的知识点,对【HIVESQL代码优化总结(容易踩坑的地方)】和【hiveSQL优化】有兴趣的朋友可以看下由【lingan_Hong】投稿的技术文章,

本文主要介绍关于hive,hadoop,sql的知识点,对【HIVE SQL 代码优化总结(容易踩坑的地方)】和【hive SQL优化】有兴趣的朋友可以看下由【lingan_Hong】投稿的技术文章,希望该技术和经验能帮到你解决你所遇的Hive相关技术问题。

hive SQL优化

一、Hadoop简介

Hadoop有两大核心:HDFS和MapReduce。
hdfs即为 Hadoop distributed file system,负责分布式数据存储;
mr即为MapReduce,负责分布式数据运算。

hive提供基于sql的查询语言用以查询数据的方式,运行hive时,脚本被编译为MapReduce进行执行。

Hive的优化主要分为:配置优化、SQL语句优化、任务优化等方案。
其中在开发过程中主要涉及到的可能是SQL优化这块。
优化的核心思想是以下四个:
减少数据量(分区裁剪、列剪裁)
避免数据倾斜(例如加参数、Key打散)
避免全表扫描(例如on添加加上分区等)
减少job数(例如相同的on条件的join放在一起作为一个任务)

二、HIVE SQL执行顺序

第一步:确定数据源,进行表的查询和加载
from
(left/right/inner/outner) join
on
第二步:过滤数据,进行条件筛选
where
group by
having
第三步:查询数据
select
第四步:显示数据
distinct
order by
limit
union/union all

二、优化技巧和代码编写注意事项 1. 列裁剪和分区裁剪

a. 列裁剪(说人话就是选自己要的字段)
这里就是尽量不使用select * from table;
而要使用 select 字段A,字段B,… from table;

b. 分区裁剪(说人话就是对于分区表要进行分区字段进行过滤)
如果不做分区操作,hive每次都会进行全表扫描,在查询的时候通过where选择指定的分区,查询效率高很多。
尽量不要直接对超大的分区表进行select 操作。如 某张表存量数据量超千亿条,TB级别。
对于分区表要进行分区字段进行过滤,然后同时注意在where后面把分区字段的筛选放到具体id的查询前面;
如何区分哪个是分区表,可以在hive使用的使用时候,在元数据搜索出来以后,可以对表查看数据字典,一般分区字段会显示PartitionField
举例:

select 字段A,字段B from table where 分区字段 = 20220101 and id = ’aaa‘;
2. 表连接(left/right/inner/outter)join优化

a. 注意使用相同的连接键
观察好要连接的两张表的主键,不要使用错误的字段进行连接。

b. 小表在前,大表在后
将条数少的表、或者子查询后的表放在Join操作符的左边。但新版的hive已经对小表JOIN大表和大表JOIN小表进行了优化。小表放在左边和右边已经没有明显区别。不过在做join的过程中通过小表在前可以适当地减少数据量,提高效率。

c. 太多个join操作,连接过于复杂时候,可以建立中间表

d. 尽早过滤数据,在子查询或者中间表中过滤数据, 同时 join后面不要跟where条件
因为这样会导致匹配的时候全表join,如果提前过滤数据,会提高效率。

举例:

select ... from table1 A
inner join table2 B
on A.key = B.key
where A.id>1 and id<10
and B.date > '2022-01-01' and B.date < '2022-07-01'

以上写法不好,
应该为:

select A.col1,A.col2, B.col3, B.col4
from (select col1,col2      
      from database.table1  
      where id > 1 and id < 10) A
inner join 
     (select col3,col4
     from database.table2 
     where date > '2022-01-01' and date < '2022-07-01'
     ) B
on A.key = B.key;
3. 避免数据倾斜

数据倾斜:就是某一个或几个key占据了整个数据的90%,或者null太多,没有处理就进行join操作,这样整个任务的效率都会被这个key的处理拖慢,同时也可能会因为相同的key会聚合到一起造成内存溢出。
可能造成数据倾斜操作的算子有:distinct、join、groupby、count distinct等。出现数据倾斜时, 可能就是你的代码中使用了这些算子中的某一个所导致的。表现出来就是hive上面的进程一直在运行没有结果。

举例,解决办法:
a. 通过参数调优:
set hive.map.aggr=true;
set hive.groupby.skewindata = ture;
但是这个处理方案对于我们来说是个黑盒,无法把控。

b. 提前了解要进行join表的字段的值的分布,如果与大量null或者无意义的值,要对于的null的值进行剔除,然后再join操作或者聚合操作。

select 字段A from TABLE where id not in ('',' ','\n','null','\null','na','\N','无')

c. 一般情况下,两张表进行join,on连接的字段都具有唯一性或者是表的主键,不会有大量的70%的重复值,这样写的时候,是否也观察一下是不是自己用来连接的字段是错的。

4. 避免笛卡尔积

笛卡尔积的定义:如A表1000行,B表100万行,笛卡尔积为1000*100w=1亿行
所以hive里面不允许使用笛卡尔积操作,会导致数据量暴增,计算集群会爆掉。这里要注意空值、无意义值、长尾数据。
join操作必须带有on,否则会产生笛卡尔积。

5. order by

使用order by必须带着limit ,因为oder by是全局排序,速度非常慢。
或者使用sort by 代替order by

6.distinct 使用group by 替代

比如要对某列去除计数,不要使用count(distinct), 要使用 group by

select count(distinct id)
from tableA
where date='2020-08-10' and id is not null

转换为

select count(a.uid)
from
(select id from tableA where id is not null and date = '2020-08-10' group by id) a
7、使用with as

在SQL中需要重复使用某张表、某部分数据(子查询)的情况,通常会选择通过with as语法,但是这种优化与子查询的数据结果的大小有关,超过某个特定的大小则不建议使用此方法,可以直接新建一个临时表。

8、注意编写规范和注释

a. 缩进与对齐
SQL如果编写的代码过长,如300、500行,在编写上如果 缩进对齐 或 范式 过于随意,嵌套太多,则可能过几天自己也看不懂自己的脚本。如下列代码:

select A.col1,A.col2, B.col3, B.col4
from (select col1,col2      
      from database.table1  
      where id > 1 and id < 10
      ) A
inner join 
     (select col3,col4
      from database.table2 
      where date > '2022-01-01' and date < '2022-07-01'
     ) B
on A.key = B.key;

b. 写好注释
其次对字段、库名、表名写好注释,脚本开头写好声明和脚本撰写作者,否则也会造成脚本不易读懂。

----------------------------------------------
---表名:xtable
---表名说明:知乎专栏日志
---开发者:lingan on 03-25 2021
---修改者:lingan on 03-25 2022
---修改内容:xxxxxxx
----------------------------------------------
drop table if not exists tableA;
create table if not exists tableA 
as
select A.col1,  ---字段col1
       A.col2,  ---字段col2
       B.col3,  ---字段col3
       B.col4   ---字段col4
from (select col1,col2      
      from database.table1  
      where id > 1 and id < 10
      ) A   ---表A
inner join 
     (select col3,col4
      from database.table2 
      where date > '2022-01-01' and date < '2022-07-01'
     ) B     ---表B
on A.key = B.key;

本文《HIVE SQL 代码优化总结(容易踩坑的地方)》版权归lingan_Hong所有,引用HIVE SQL 代码优化总结(容易踩坑的地方)需遵循CC 4.0 BY-SA版权协议。


推荐阅读
  • MapReduce工作流程最详细解释
    MapReduce是我们再进行离线大数据处理的时候经常要使用的计算模型,MapReduce的计算过程被封装的很好,我们只用使用Map和Reduce函数,所以对其整体的计算过程不是太 ... [详细]
  • mapreduce源码分析总结
    这篇文章总结的非常到位,故而转之一MapReduce概述MapReduce是一个用于大规模数据处理的分布式计算模型,它最初是由Google工程师设计并实现的ÿ ... [详细]
  • 什么是大数据lambda架构
    一、什么是Lambda架构Lambda架构由Storm的作者[NathanMarz]提出,根据维基百科的定义,Lambda架构的设计是为了在处理大规模数 ... [详细]
  • 我们在之前的文章中已经初步介绍了Cloudera。hadoop基础----hadoop实战(零)-----hadoop的平台版本选择从版本选择这篇文章中我们了解到除了hadoop官方版本外很多 ... [详细]
  • Java开发实战讲解!字节跳动三场技术面+HR面
    二、回顾整理阿里面试题基本就这样了,还有一些零星的问题想不起来了,答案也整理出来了。自我介绍JVM如何加载一个类的过程,双亲委派模型中有 ... [详细]
  • Hadoop之Yarn
    目录1Hadoop1.x和Hadoop2.x架构区别2Yarn概述3Yarn基本架构4Yarn工作机制5作业提交全过程6资源调度器7任务的推测执行1Hadoop1.x和Hadoo ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 解决.net项目中未注册“microsoft.ACE.oledb.12.0”提供程序的方法
    在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报错“未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序”。本文提供了解决这个问题的方法,包括错误描述和代码示例。通过注册提供程序和修改连接字符串,可以成功读取excel文件信息。 ... [详细]
  •     这里使用自己编译的hadoop-2.7.0版本部署在windows上,记得几年前,部署hadoop需要借助于cygwin,还需要开启ssh服务,最近发现,原来不需要借助cy ... [详细]
  • 开发笔记:大数据之Hadoop(MapReduce):GroupingComparator分组案例实操
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了大数据之Hadoop(MapReduce):GroupingComparator分组案例实操相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 开发笔记:Hadoop Mapreduce
    代码如下: ... [详细]
author-avatar
游泳
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有