一、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.intervalhive.mapjoin.size.keyhive.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时支持加入条件过滤。

hive中groupby优化_Hive 查询优化总结相关推荐

  1. hive中groupby优化_Hive数据倾斜

    Hive数据倾斜 Group By 中的计算均衡优化 1.Map端部分聚合 先看看下面这条SQL,由于用户的性别只有男和女两个值 (未知).如果没有map端的部分聚合优化,map直接把groupby_ ...

  2. hive的set优化_Hive优化(整理版)

    1. 概述 1.1 hive的特征: 可以通过SQL轻松访问数据的工具,从而实现数据仓库任务,如提取/转换/加载(ETL),报告和数据分析: 它可以使已经存储的数据结构化: 可以直接访问存储在Apac ...

  3. exists hive中如何使用_HIVE使用基础

    查看所有表:   show tables; 查看表结构:   desc 表名 查看表的分区:  show partitions 表名; 查看UDF: HIVE允许用户使用UDF(user define ...

  4. mysql hive 内置函数_Hive中与时间相关的内置函数

    (1)获取当前的时间戳(以秒位单位):unix_timestamp(),返回值类型位BIGINT.例如: select unix_timestamp() from dim_user limit 1; ...

  5. hive中如何读取数组_hive解析json嵌套数组

    hive怎么统计json中某一项的内容 Hive提供json抽取函数get_json_object,根据json_path来获取你所抽取的项 get_json_object函数第一个参数填写json对 ...

  6. hive 表存储大小_Hive中文件存储格式及大小比较测试

    在hive中创建表是有如下一个语句 [ROW FORMAT row_format] row_format 的类型有如下: file_format: : SEQUENCEFILE | TEXTFILE ...

  7. hive中的逻辑运算符 案列_Hive内置运算符

    本章介绍Hive的内置运算符.在Hive有四种类型的运算符: 关系运算符 算术运算符 逻辑运算符 复杂运算符 关系运算符 这些操作符被用来比较两个操作数.下表描述了在Hive中可用的关系运算符: 运算 ...

  8. 浅谈Hive SQL的优化

    目前团队的数据处理都在Hadoop集群上, 一是因为需要处理的数据量都是亿级的,这种规模的数据适合用Hadoop集群并行处理: 二是免除了分库分表给查询处理上带来的麻烦.Hive是基于Hadoop的一 ...

  9. 061 hive中的三种join与数据倾斜

    一:hive中的三种join 1.map join 应用场景:小表join大表 一:设置mapjoin的方式: )如果有一张表是小表,小表将自动执行map join. 默认是true. <pro ...

最新文章

  1. 聊聊Synchronized
  2. 极致流畅体验的密码:网易云信 QoS 策略介绍 | 体验共享技术专题
  3. 第十一节,利用yolov3训练自己的数据集
  4. knn机器学习算法_K-最近邻居(KNN)算法| 机器学习
  5. python copy函数用法_python shutil模块函数copyfile和copy的区别
  6. CSS3新增-属性(长度颜色背景)选择器-盒子模型
  7. 【MYSQL笔记】MYSQL监视器
  8. java文本框内容覆盖6_java中读入一个TXT文件到文本框空如何覆盖以前读的内容?...
  9. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-9.使用JWT生成用户Token回写客户端...
  10. UA MATH523A 实分析3 积分理论例题 Fubini定理计算简单一元定积分的一个例题
  11. 【华人学者风采】聂飞平 西北工业大学
  12. php alt什么意思,img标签的alt作用是什么
  13. signature=c31ee9b23a444aeb59534b250024e5ac,Assembling unit for tube components
  14. Docker容器下安装ubantu,其中 command not found 的问题(已经解决)
  15. 计算机桌面背景显示方式有几种,如何让计算机自动更改桌面背景
  16. layui table 渲染动态列及列数据
  17. 菜鸟供应链实时数仓的架构演进及应用场景
  18. 校招-蘑菇街,阿里面试总结
  19. CS5213HDMI转VGA带3.5mm音频转接线|HDMI转VGA带3.5MM音频方案
  20. 树莓派挂载和卸载U盘或移动硬盘

热门文章

  1. 理解Mysql prepare预处理语句:mysql_stmt_init(MYSQL *mysql);
  2. java 重力脚本_Java中非常简单的脚本解析器
  3. 坐标偏差大_三坐标常见撞针原因,总结的太到位了!
  4. python保存数据db_python存储数据到mongodb
  5. idw matlab 程序_IDW 算法MATLAB 实现 -
  6. Django怎么配置mysql数据库_Django如何配置mysql数据库
  7. Leecode刷题热题HOT100(4)——寻找两个正序数组的中位数
  8. OpenShift 4 之 Idle Pod
  9. AI队列长度检测:R-CNN用于使用Keras进行自定义对象检测
  10. .NET Core:通过Web API进行微服务交互