`

Hive 查询优化【引文】

    博客分类:
  • Hive
 
阅读更多

一、join优化

Join查找操作的基本原则:应该将条目少的表/子查询放在 Join 操作符的左边。原因是在 Join 操作的 Reduce 阶段,位于 Join 操作符左边的表的内容会被加载进内存,将条目少的表放在左边,可以有效减少发生内存溢出错误的几率。

Join查找操作中如果存在多个join,且所有参与join的表中其参与join的key都相同,则会将所有的join合并到一个mapred程序中。

案例:

SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1)  在一个mapre程序中执行join

SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key2)   在两个mapred程序中执行join

Map join的关键在于join操作中的某个表的数据量很小,案例:

SELECT a.key, a.value

  FROM a join b on a.key = b.key

Mapjoin 的限制是无法执行a FULL/RIGHT OUTER JOIN b,和map join相关的hive参数:hive.join.emit.interval hive.mapjoin.size.key hive.mapjoin.cache.numrows

由于join操作是在where操作之前执行,所以当你在执行join时,where条件并不能起到减少join数据的作用;案例:

SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key)

  WHERE a.ds='2009-07-07' AND b.ds='2009-07-07'

最好修改为:

SELECT a.val, b.val FROM a LEFT OUTER JOIN b

  ON (a.key=b.key AND b.ds='2009-07-07' AND a.ds='2009-07-07')

在join操作的每一个mapred程序中,hive都会把出现在join语句中相对靠后的表的数据stream化,相对靠前的变的数据缓存在内存中。当然,也可以手动指定stream化的表:SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1)

二、group by 优化

Map端聚合,首先在map端进行初步聚合,最后在reduce端得出最终结果,相关参数:

· hive.map.aggr = true是否在 Map 端进行聚合,默认为 True

· hive.groupby.mapaggr.checkinterval = 100000在 Map 端进行聚合操作的条目数目

数据倾斜聚合优化,设置参数hive.groupby.skewindata = true,当选项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果集合会随机分布到 Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 Group By Key 有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照 Group By Key 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个 Reduce 中),最后完成最终的聚合操作。

三、合并小文件

文件数目过多,会给 HDFS 带来压力,并且会影响处理效率,可以通过合并 Map 和 Reduce 的结果文件来消除这样的影响:

· hive.merge.mapfiles = true是否和并 Map 输出文件,默认为 True

· hive.merge.mapredfiles = false是否合并 Reduce 输出文件,默认为 False

· hive.merge.size.per.task = 256*1000*1000合并文件的大小

四、Hive实现(not) in

通过left outer join进行查询,(假设B表中包含另外的一个字段 key1

select a.key from a left outer join b on a.key=b.key where b.key1 is null

通过left semi join 实现 in

SELECT a.key, a.val FROM a LEFT SEMI JOIN b on (a.key = b.key)

Left semi join 的限制:join条件中右边的表只能出现在join条件中。

五、排序优化

Order by 实现全局排序,一个reduce实现,效率低

Sort by 实现部分有序,单个reduce输出的结果是有序的,效率高,通常和DISTRIBUTE BY关键字一起使用(DISTRIBUTE BY关键字 可以指定map 到 reduce端的分发key)

CLUSTER BY col1 等价于DISTRIBUTE BY col1 SORT BY col1

六、使用分区

Hive中的每个分区都对应hdfs上的一个目录,分区列也不是表中的一个实际的字段,而是一个或者多个伪列,在表的数据文件中实际上并不保存分区列的信息与数据。Partition关键字中排在前面的为主分区(只有一个),后面的为副分区

静态分区:静态分区在加载数据和使用时都需要在sql语句中指定

          案例:(stat_date='20120625',province='hunan')

动态分区:使用动态分区需要设置hive.exec.dynamic.partition参数值为true,默认值为false,在默认情况下,hive会假设主分区时静态分区,副分区使用动态分区;如果想都使用动态分区,需要设置set hive.exec.dynamic.partition.mode=nostrick,默认为strick

案例:(stat_date='20120625',province)

七、Distinct 使用

Hive支持在group by时对同一列进行多次distinct操作,却不支持在同一个语句中对多个列进行distinct操作。

八、Hql使用自定义的mapred脚本

注意事项:在使用自定义的mapred脚本时,关键字MAP REDUCE 是语句SELECT TRANSFORM ( ... )的语法转换,并不意味着使用MAP关键字时会强制产生一个新的map过程,使用REDUCE关键字时会产生一个red过程。

自定义的mapred脚本可以是hql语句完成更为复杂的功能,但是性能比hql语句差了一些,应该尽量避免使用,如有可能,使用UDTF函数来替换自定义的mapred脚本

九、UDTF

UDTF将单一输入行转化为多个输出行,并且在使用UDTF时,select语句中不能包含其他的列,UDTF不支持嵌套,也不支持group by 、sort by等语句。如果想避免上述限制,需要使用lateral view语法,案例:

select a.timestamp, get_json_object(a.appevents, '$.eventid'), get_json_object(a.appenvets, '$.eventname') from log a;

select a.timestamp, b.*

from log a lateral view json_tuple(a.appevent, 'eventid', 'eventname') b as f1, f2;

其中,get_json_object为UDF函数,json_tuple为UDTF函数。

UDTF函数在某些应用场景下可以大大提高hql语句的性能,如需要多次解析json或者xml数据的应用场景。

十、聚合函数count和sum

Count和sum函数可能是在hql语句中使用的最为频繁的两个聚合函数了,但是在hive中count函数在计算distinct value时支持加入条件过滤。

 

原文地址:http://www.open-open.com/lib/view/open1341214750402.html

以上是Hive查询优化的资料,值得阅读与记忆,但是同时有几个方面的疑问也值得深究一下为什么:

1,为什么Hive在jion操作时Where条件并不能减少jion数据?

2,在hive中count函数在计算distinct value时,怎样加入条件过滤?

分享到:
评论

相关推荐

    Hive查询优化整理与Hive简易版思维导图

    本文将深入探讨Hive查询优化的一些关键点,并结合个人实践经验和整理的Hive简易版思维导图,帮助你更好地理解和运用Hive。 一、Hive查询优化基础 1. **表分区**:分区是Hive提高查询效率的重要手段。通过将大表按...

    hive查询优化

    ### Hive查询优化详解 #### 一、Hive基础与架构 **Hive**作为Hadoop生态中的重要组成部分,被广泛应用于大数据分析领域。它通过提供类SQL语言(HiveQL)来简化对Hadoop分布式文件系统(HDFS)中存储的大规模数据集...

    hive参数优化总结

    Hive 参数优化总结 Hive 是一个基于 Hadoop 的数据仓库工具,用于对大规模数据进行查询、分析和处理。为了提高 Hive 的性能和效率,参数优化是非常重要的一步。本文档将总结 Hive 参数优化的相关知识点,并对 Hive ...

    Hive性能优化总结

    ### Hive性能优化总结 #### 一、Hadoop与Hive计算框架特性引发的问题 Hadoop作为大数据处理平台,其核心优势在于能够高效处理大规模数据集。然而,在具体的应用场景中,尤其是在Hive作为数据仓库使用时,仍存在...

    hive高级分析函数与优化.rar_hive_hive 函数优化_hive 分析 大数据_hive高级优化_oldwlc

    此外,Hive的分区和桶表策略能进一步优化查询性能。 4. **Hive高级优化**: 高级优化包括表和列的压缩、数据倾斜处理、Join优化、SubQuery优化、以及使用Explain命令分析查询计划等。压缩可以减小存储空间,数据...

    Hive性能优化复习总结.doc.pdf

    Hive性能优化总结 Hive性能优化是一个复杂的问题,它涉及到Hadoop的计算框架特性、数据倾斜问题、MapReduce作业初始化时间长、SUM、COUNT、MAX、MIN等UDAF函数的使用、COUNT(DISTINCT)函数的低效、数据分布不均、...

    Hive优化.docx

    - **利用Hive对UNION ALL的优化**:Hive优化非嵌套的UNION ALL查询,但嵌套查询不受此优化影响。 5. **Hadoop通用关联实现**: - **关联通过二次排序实现**:关联列作为分区键,关联列和其他列组合形成排序的组键...

    hive优化总结

    hive优化总结 Hive优化总结是Hive性能优化的总结,涉及HIVE的参数设置、HQL语言的写法、JOIN操作的优化、MapReduce操作的优化、列裁剪、分区裁剪等多个方面。 1. 配置文件优化 Hive的配置文件hive-site.xml是Hive...

    Hive思维导图之Hive优化

    Hive思维导图之Hive优化

    hive性能优化

    1. Hive查询优化实践 - Owen O'Malley作为Hortonworks的创始人兼架构师,长期从事Hive开发工作,与客户密切合作,并有着Hadoop MapReduce与安全性方面的深厚经验。 - 优化Hive查询需要深入理解数据布局、数据格式...

    hive性能优化.pptx

    hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载。此文档是基于hive大数据库简介、使用场景、性能优化

    hive常见的优化方案ppt

    在大数据处理领域,Hive作为一个基于...通过上述优化手段,我们可以有效地提升Hive的查询效率和整体性能,应对大数据分析中的挑战。但要注意,每种优化措施都有其适用场景,需根据具体业务需求和数据特点灵活应用。

    hive参数优化文档

    在Hive的整体架构中进行优化,主要是为了提升查询处理效率及资源利用率。以下是一些关键点: 1. **表设计**: - **分区表**:根据查询维度进行分区,如日期分区等。这有助于减少扫描的数据量。 - **桶表**:通过...

    工作总结hive优化

    通过对Hive及其底层Hadoop的理解,结合实际案例分析,我们可以看到Hive优化是一个综合性的工作,涉及模型设计、查询优化、配置调整等多个方面。只有综合考虑各种因素,才能最大程度地发挥Hive的能力,提高大数据处理...

    Hive查询优化:Sort By、Order By、Cluster By、Distribute深入解析

    Hive是一种数据仓库软件,用于对存储在分布式存储系统(如Hadoop)中的大数据进行查询和管理。...6. **优化执行**:Hive具有自己的查询优化器,可以将HiveQL查询转换为高效的MapReduce、Tez或Spark作业。

    第6章:Hive性能优化及Hive3新特性1

    总结来说,Hive性能优化涉及多个层面,包括表结构设计、数据组织、执行引擎选择、查询优化等,需要根据实际业务需求综合考虑并实施。通过这些优化,Hive能够更高效地处理大规模数据,提高大数据分析的效率。

    基于Hadoop+Hive的数据查询优化设计与实现

    "基于Hadoop+Hive的数据查询优化设计与实现" 本文旨在介绍基于Hadoop和Hive的数据查询优化设计与实现,旨在解决大数据处理的需求。该文涵盖了Hadoop和Hive的工作原理、系统设计与实现、数据查询优化等方面的知识点...

    Hive优化案例、Hive数据处理模式、Hive常见问题与优化、Hive实践

    Hive优化案例、Hive数据处理模式、Hive常见问题与优化、Hive实践 Hive是一种基于Hadoop的数据仓库工具,用于对大规模数据进行处理和分析。在大数据时代,Hive的应用非常广泛,本文将从Hive优化案例、Hive数据处理...

    Hive_优化——深入浅出学Hive

    【Hive 优化——深入浅出学 Hive】 在大数据领域,Hive 是一个不可或缺的工具,主要用于数据仓库和商业智能(BI)分析。虽然它的主要操作是通过 SQL 进行,但理解其内部原理和优化策略对于提升集群执行效率至关重要...

Global site tag (gtag.js) - Google Analytics