Hive 查询优化总结
- 格式:doc
- 大小:42.50 KB
- 文档页数:3
深入理解Hive的查询执行计划与优化策略Hive是一种在Hadoop生态系统中运行的数据仓库工具,它提供了Hive查询语言(HQL),允许用户以类似于SQL的方式进行数据查询和分析。
然而,由于Hive在Hadoop上运行,数据量通常庞大且分布广泛,因此查询性能和效率成为关键问题。
为了优化Hive查询,我们需要深入了解Hive的查询执行计划和优化策略。
一、查询执行计划在Hive中,查询执行计划是指查询语句在执行之前的逻辑计划和执行计划。
逻辑计划描述了执行查询所需的转换和操作,而执行计划则是根据物理资源和数据分布来优化查询的实际执行计划。
1. 逻辑计划Hive将查询语句转换为逻辑计划,该计划是一个以树状结构表示的操作符序列。
这些操作符包括从表中选择数据、过滤数据、合并结果等。
逻辑计划不关心具体的物理资源和数据分布,只考虑查询语句的语义和逻辑关系。
2. 执行计划执行计划是根据逻辑计划和物理资源进行优化的实际计划。
在生成执行计划时,Hive会考虑查询的数据分布、数据倾斜、数据压缩等因素,以及执行查询所需的资源(CPU、内存等)。
执行计划可以通过Explain命令来查看,它显示了Hive的查询优化过程。
二、优化策略为了提高查询性能和效率,Hive提供了多种优化策略。
下面介绍几种常用的优化策略:1. 分区剪枝分区剪枝是指在执行查询时,根据查询条件的分区键过滤无关分区,从而减少数据扫描的量和执行时间。
Hive会在执行计划中添加分区剪枝操作,根据查询条件和分区键的关系自动剪除不需要扫描的分区。
2. 列剪枝列剪枝是指根据查询语句中所需的列,优化执行计划,只从存储中读取必要的列数据,而不是读取整个表的数据。
这样可以减少磁盘I/O和数据传输的量,从而提高查询性能。
3. 合并MapReduce任务Hive通常使用MapReduce作为执行引擎,将查询转换为多个MapReduce任务进行并行计算。
然而,如果多个任务可以合并为一个任务,可以显著减少任务之间的数据传输和开销,提高执行效率。
提高Hive查询性能的几种方法Hive是一种在Hadoop上运行的数据仓库工具,用于处理大规模数据集。
尽管Hive的强大之处在于它能够处理大数据量,但在某些情况下,查询性能可能会变得缓慢。
为了提高Hive查询的执行速度,下面将介绍几种方法。
1. 数据分区数据分区是提高Hive查询性能的重要方法之一。
通过将数据按照特定的列进行分区,可以使查询仅限于需要的数据分区,从而减少查询开销。
数据分区还能够增加查询的并行性,从而进一步加快查询速度。
在创建表时,可以根据数据特点选择合适的分区方式,例如按照日期、地理位置等进行分区。
2. 分桶表分桶是将表中的数据按照一定的规则划分到不同的桶中,以便查询时可以只读取特定的桶,而无需扫描整个数据集。
分桶表可以大大减少查询的数据量,提高查询性能。
在创建表时,可以指定分桶的数量和分桶所依据的列,以便更好地适应查询需求。
3. 数据压缩数据压缩是提高Hive查询性能的另一个关键点。
通过使用压缩算法,可以减少磁盘上的存储空间,并减少数据在网络上传输的大小。
压缩后的数据可以更快地加载和读取,从而加快查询速度。
在创建表时,可以选择合适的压缩格式,如Snappy、Gzip等,根据数据类型和查询需求进行选择。
4. 数据索引在Hive中,使用索引可以加快特定列的查询,尤其是在大数据集上进行过滤操作。
在常规的Hive版本中,尚未支持内置的索引功能,但可以使用其他方法来实现类似的效果。
一种方法是使用HBase作为Hive的存储后端,并在HBase中创建索引。
另一种方法是使用外部索引工具,如Elasticsearch或Solr。
通过使用合适的索引机制,可以显著提高查询性能。
5. 数据分档数据分档是一种将大数据集划分为逻辑上相关的分区的方法。
通过根据查询需求将数据分为不同的分区级别,可以减少不必要的数据读取和处理。
例如,可以根据数据的时间戳进行分档,将数据按照年、月、日等进行分区,从而只选择需要的时间范围进行查询。
深入理解Hive查询优化与执行计划Hive是一个构建在Hadoop之上的数据仓库基础架构,具有高扩展性和容错性。
它提供了类似于SQL的查询语言——HiveQL,使得开发者可以使用SQL语句而不需要了解复杂的MapReduce编程。
尽管Hive在读取大型数据集时表现出色,但在进行复杂查询时,性能可能会受到影响。
为了优化查询性能并提高执行计划的效率,我们需要深入理解Hive查询优化与执行计划。
Hive查询优化的目标是提高查询性能和降低资源消耗。
为了实现这一目标,Hive查询优化器会尝试优化查询计划,选择更有效的操作顺序和算法,以减少数据读取和转换的开销。
下面将介绍一些常见的Hive查询优化技术。
首先是分区和分桶。
Hive能够根据表的列值将数据分成不同的分区,这样可以将查询范围限制在特定的分区上,减少查询的数据量。
分桶则是将数据分成更小的单位,使得查询操作只需要在一个桶(bucket)中进行,从而加快查询速度。
其次是索引和统计信息。
在Hive中,我们可以通过创建索引来加快查询速度。
索引可以在某些列上创建,从而快速定位满足特定条件的行。
另外,Hive还可以收集统计信息,例如表的大小、列的不同值的数量等,通过这些统计信息,优化器能够根据查询条件评估并选择更优的执行计划。
还有一项重要的优化技术是数据倾斜处理。
在某些情况下,某些列的值分布极不均匀,导致某些任务运行时间较长。
为了解决这个问题,可以通过数据重塑、倾斜处理或使用动态分区等方法来解决数据倾斜问题。
一旦我们了解了Hive查询优化技术,我们就需要关注执行计划的生成和调优。
执行计划是Hive为我们的查询所准备的一系列任务和操作的有序列表。
对于复杂的查询,执行计划的优化非常关键。
Hive将查询分成多个阶段,并将每个阶段分解成更小的任务。
任务的划分依赖于数据的分区和桶,以及并行处理的配置。
根据查询的复杂性和数据规模,Hive 可能生成很多任务,这些任务会在集群中并行执行。
hive优化要点总结电脑资料再好的硬件没有充分利用起来,都是白扯淡,比方:通常来说前面的任务启动可以稍带一起做的事情就一起做了,以便后续的多个任务重用,与此严密相连的是模型设计,好的模型特别重要. reduce个数过少没有真正发挥hadoop并行计算的威力,但reduce 个数过多,会造成大量小文件问题,数据量、资源情况只有自己最清楚,找到个折衷点,比方:假设其中有一个表很小使用map join,否那么使用普通的reduce join,注意hive会将join前面的表数据装载内存,所以较小的一个表在较大的表之前,减少内存资源的消耗在hive里有两种比较常见的处理方法第一是使用Combinefileinputformat,将多个小文件打包作为一个整体的inputsplit,减少map任务数set mapred.max.split.size=256000000;set mapred.min.split.size.per.node=256000000set Mapred.min.split.size.per.rack=256000000sethive.input.format=bineHiveI nputFormat第二是设置hive参数,将额外启动一个MR Job打包小文件hive.merge.mapredfiles = false 是否合并Reduce输出文件,默认为Falsehive.merge.size.per.task = 256*1000*1000 合并文件的大小在hive里比较常用的处理方法第一通过hive.groupby.skewindata=true控制生成两个MR Job,第一个MR Job Map的输出结果随机分配到reduce做次预汇总,减少某些key值条数过多某些key条数过小造成的数据倾斜问题第二通过hive.map.aggr = true(默认为true)在Map端做biner,假设map各条数据根本上不一样, 聚合没什么意义,做biner反而画蛇添足,hive里也考虑的比较周到通过参数hive.groupby.mapaggr.checkinterval = 100000 (默认)hive.map.aggr.hash.min.reduction=0.5(默认),预先取100000条数据聚合,如果聚合后的条数/100000>0.5,那么不再聚合multi insert适合基于同一个源表按照不同逻辑不同粒度处理插入不同表的场景,做到只需要扫描源表一次,job个数不变,减少源表扫描次数union all用好,可减少表的扫描次数,减少job的个数,通常预先按不同逻辑不同条件生成的查询union all后,再统一group by计算,不同表的union all相当于multiple inputs,同一个表的union all,相当map一次输出多条集群参数种类繁多,举个例子比方可针对特定job设置特定参数,比方jvm重用,reduce copy线程数量设置(适合map较快,输出量较大)如果任务数多且小,比方在一分钟之内完成,减少task数量以减少任务初始化的消耗,:blog.csdn./u011750989/article/details/12024301。
Hive的10种优化总结Hive作为⼤数据领域常⽤的数据仓库组件,在平时设计和查询时要特别注意效率。
影响Hive效率的⼏乎从不是数据量过⼤,⽽是数据倾斜、数据冗余、job或I/O过多、MapReduce分配不合理等等。
对Hive的调优既包含对HiveSQL语句本⾝的优化,也包含Hive配置项和MR⽅⾯的调整。
列裁剪和分区裁剪最基本的操作。
所谓列裁剪就是在查询时只读取需要的列,分区裁剪就是只读取需要的分区。
以我们的⽇历记录表为例:select uid,event_type,record_datafrom calendar_record_logwhere pt_date >= 20190201 and pt_date <= 20190224and status = 0;当列很多或者数据量很⼤时,如果select *或者不指定分区,全列扫描和全表扫描效率都很低。
Hive中与列裁剪优化相关的配置项是hive.optimize.cp,与分区裁剪优化相关的则是hive.optimize.pruner,默认都是true。
在HiveSQL解析阶段对应的则是ColumnPruner逻辑优化器。
谓词下推在关系型数据库如MySQL中,也有谓词下推(Predicate Pushdown,PPD)的概念。
它就是将SQL语句中的where谓词逻辑都尽可能提前执⾏,减少下游处理的数据量。
例如以下HiveSQL语句:select a.uid,a.event_type,b.topic_id,b.titlefrom calendar_record_log aleft outer join (select uid,topic_id,title from forum_topicwhere pt_date = 20190224 and length(content) >= 100) b on a.uid = b.uidwhere a.pt_date = 20190224 and status = 0;对forum_topic做过滤的where语句写在⼦查询内部,⽽不是外部。
hive优化总结在大数据处理领域中,Hadoop已经成为主流的框架之一。
Hadoop 的一个重要组件是Hive,这是一个基于Hadoop的数据仓库基础工具。
Hive的目标是提供一个类SQL查询的接口,以便于对存储于Hadoop集群中的数据进行分析和查询。
然而,在实际使用中,Hive的性能和效率往往会受到限制。
本文将介绍一些提高Hive性能和优化的技巧和方法。
首先,要注意数据分区。
在Hive中,数据分区可以将数据以更细粒度的方式进行组织和存储,从而提高查询效率。
通过将数据分区存储在不同的目录中,Hive可以避免扫描整个数据集,并仅从感兴趣的分区中读取数据。
因此,正确地定义和使用数据分区是提高Hive性能的重要步骤之一。
其次,使用合适的表格式也是优化Hive的关键。
Hive支持多种表格式,例如文本、序列文件和列式存储等。
每种表格式都有自己的特点和适用场景。
在选择表格式时,需要考虑数据大小、查询类型以及存储需求等因素。
例如,对于需要频繁进行聚合操作的场景,列式存储格式通常更加高效。
另外,可以使用分桶技术来改善Hive的性能。
分桶是将表按照某个列的值进行分组,使得具有相同分桶值的数据存储在相同的桶中。
通过使用分桶技术,Hive可以更快地进行连接操作和过滤操作,从而提高查询效率。
在选择分桶列时,应选择具有较高的基数和较为均匀分布的列。
此外,使用Hive的索引功能也能够加速查询。
Hive支持对表中的列创建索引,从而可以更快地定位和访问数据。
通过使用索引,Hive可以减少全表扫描的开销,并且在一些特定的查询场景下,索引的使用可以显著提高查询性能。
然而,需要注意的是,索引会增加数据的存储空间和更新的成本,因此在使用索引时需要进行权衡。
最后,合理地配置Hive参数也是优化Hive性能的一项重要工作。
Hive的性能受到许多配置参数的影响,例如内存大小、并行度和任务调度等。
根据具体的场景和需求,可以对这些参数进行调整,以获得更好的性能和效率。
hive优化总结Hive优化总结Hive是一种建立在Hadoop之上的开源数据仓库解决方案,它可以使用类似SQL的查询语言来处理大规模数据集。
然而,由于数据集的规模越来越庞大,并且查询的复杂度也在增加,Hive的性能可能会受到影响。
因此,对Hive进行优化是提高查询效率和性能的关键。
一、数据分区在Hive中,数据分区是一种将数据按照特定的列进行划分存储的方式。
通过合理地选择分区列,可以提高查询性能。
例如,在时间序列数据中,通过将数据按照时间列进行分区,可以将查询仅限于需要的时间范围,提高查询效率。
二、数据压缩Hive支持多种数据压缩格式,如Gzip、Snappy和LZO等。
使用数据压缩可以显著减少存储空间,并且对于IO密集型操作,如数据扫描,也可以显著提高性能。
在选择数据压缩格式时,需要综合考虑存储空间和查询性能之间的权衡。
三、分桶类似于数据分区,分桶也是一种将数据进行划分的方式。
不同的是,分桶是将数据按照某一列的哈希值进行划分,可以提高数据的均衡性。
通过通过使用分桶,可以提高数据的访问效率,尤其是对于某些需要经常进行随机访问的操作。
四、合理使用索引在Hive中,可以使用B树索引来加速查询。
合理地创建索引可以显著提高查询性能。
然而,索引也会带来额外的存储开销和维护成本,因此需要权衡是否使用索引。
通常情况下,索引适用于数据量较小、查询频繁的情况下。
五、数据倾斜处理在大规模数据集中,数据倾斜是一个不可避免的问题。
数据倾斜会导致查询性能不均衡,某些任务的执行时间远远超出了预期。
针对数据倾斜问题,可以使用一些优化技术,如数据倾斜的处理和随机均匀分布。
六、并行执行并行执行是提高Hive查询性能的一个关键技术。
在Hive中,可以通过设置合适的查询并行度,将一个复杂的查询分解为多个子任务并行执行。
这样可以加快查询速度,提高整体的性能。
七、动态分区动态分区是一种在查询时根据查询条件动态创建分区的技术。
通过使用动态分区,可以避免在每次插入数据时都需要手动创建分区的操作,简化了操作流程,提高了数据的管理效率。
Hive(⼗)Hive性能调优总结⼀、Fetch抓取1、理论分析Fetch抓取是指,Hive中对某些情况的查询可以不必使⽤MapReduce计算。
例如:SELECT * FROM employees;在这种情况下,Hive可以简单地读取employee对应的存储⽬录下的⽂件,然后输出查询结果到控制台。
在hive-default.xml.template⽂件中hive.fetch.task.conversion默认是more,⽼版本hive默认是minimal,该属性修改为more以后,在全局查找、字段查找、limit查找等都不⾛mapreduce。
<property><name>hive.fetch.task.conversion</name><value>more</value><description>Expects one of [none, minimal, more].Some select queries can be converted to single FETCH task minimizing latency.Currently the query should be single sourced not having any subquery and should not haveany aggregations or distincts (which incurs RS), lateral views and joins.0. none : disable hive.fetch.task.conversion1. minimal : SELECT STAR, FILTER on partition columns, LIMIT only2. more : SELECT, FILTER, LIMIT only (support TABLESAMPLE and virtual columns)</description></property>2、案例实操(1)把hive.fetch.task.conversion设置成none,然后执⾏查询语句,都会执⾏mapreduce程序。
大数据性能优化之Hive优化一、引言Hive是建立在Hadoop之上的数据仓库基础设施,用于处理大规模数据集。
然而,在处理大数据时,Hive的性能可能会受到一些因素的影响,如数据倾斜、查询优化等。
因此,本文将介绍一些Hive性能优化的方法,以提高查询效率和减少执行时间。
二、数据倾斜处理1. 了解数据倾斜的原因:数据倾斜是指在某些列或者分区中,数据的分布不均匀,导致某些任务的执行时间明显延长。
2. 使用随机数分桶:通过在表中添加一个随机数列,并使用该列进行分桶,可以将数据均匀分布到不同的桶中,从而减少数据倾斜的影响。
3. 使用动态分区:动态分区可以根据数据的值自动创建分区,避免了手动创建分区时可能浮现的数据倾斜问题。
三、查询优化1. 使用合适的数据存储格式:选择合适的存储格式可以提高查询性能。
例如,使用列式存储格式(如Parquet或者ORC)可以减少I/O操作,提高查询效率。
2. 使用分区和索引:通过将数据分成多个分区,并在常用的查询列上创建索引,可以减少扫描的数据量,提高查询速度。
3. 避免全表扫描:尽量避免使用SELECT *的方式查询数据,而是明确指定需要查询的列,减少不必要的数据读取。
4. 使用合适的连接方式:在Hive中,可以使用JOIN操作连接多个表。
为了提高查询性能,应尽量避免使用大表与大表的JOIN,可以考虑使用MAPJOIN或者BUCKET JOIN等方式来优化连接操作。
四、资源配置和调优1. 调整内存参数:根据集群的硬件资源和数据规模,合理配置Hive的内存参数,如mapreduce.map.memory.mb、mapreduce.reduce.memory.mb等,以充分利用集群资源。
2. 并行度调整:通过调整mapreduce.job.reduces参数,控制并行度,使得任务能够充分利用集群资源,提高数据处理速度。
3. 合理设置数据压缩:使用数据压缩可以减少磁盘占用和I/O操作,但过多的压缩会增加CPU负载。
完全掌握Hive数据库管理与优化Hive数据库管理与优化Hive是一个建立在Hadoop之上的数据仓库工具,它提供了一个类似于关系型数据库的查询语言HiveQL来方便用户进行数据分析与处理。
在大数据时代,Hive数据库管理与优化变得至关重要。
本文将分享一些方法和策略,帮助您完全掌握Hive数据库的管理与优化。
1. 数据模型优化在Hive中,良好的数据模型设计可以大大提高查询性能。
以下是一些优化数据模型的技巧:- 分区表:将数据分区为更小的片段,可以加快查询,减少所需扫描的数据量。
- 分桶表:分桶可以在大数据集上提供更好的查询性能。
可以根据数据的散列值将数据划分为多个桶,以便更快地定位和读取特定数据。
- 压缩表:压缩表可以减少磁盘空间的使用,并提高数据加载和查询性能。
- 使用适当的数据类型:使用合适的数据类型来存储数据,可以减少存储空间的使用,并提高查询性能。
- 避免使用过多的JOIN操作:JOIN操作需要较大的计算和资源消耗,应该尽量避免过多的JOIN操作。
2. 分区和索引管理在Hive中,对分区和索引进行适当的管理也是提高性能的重要一环。
- 分区维护:如果表中的数据在某个字段上有明显的划分,应使用分区来提高查询性能。
在添加新数据时,需要维护分区的方式,以便查询时可以尽快定位到所需的数据。
- 索引的选择和创建:根据查询的需求,选择合适的字段创建索引,可以显著提高查询性能。
索引可以减少全表扫描的需求,但也需要在维护索引和存储开销之间进行权衡。
3. 查询优化针对Hive查询的优化策略如下:- 抽样查询:对于大规模的数据集,可以使用抽样查询来加快查询速度。
通过对数据的随机抽样,可以减少所需扫描的数据量。
- 合并小文件:在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 /*+ MAPJOIN(b) */ 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 /*+ STREAMTABLE(a) */ 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时支持加入条件过滤。