HIVE优化提示-如何写好HQL

一、     Hive join优化

1.     尽量将小表放在join的左边,我们这边使用的hive-0.12.0,所以是自动转化的,既把小表自动装入内存,执行map side join(性能好), 这是由参数hive.auto.convert.join=true 和hive.smalltable.filesize=25000000L)参数控制(默认是25M),如果表文件大小在25M左右,可以适当调整此参数,进行map
side join,避免reduce side join。 也可以显示声明进行map join:特别适用于小表join大表的时候,SELECT /*+ MAPJOIN(b) */ a.key, a.value FROM a join b on a.key = b.key

2.     注意带表分区的join, 如:

SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key) WHERE a.dt=‘2014-08-07‘ AND b.dt=‘2014-08-07‘

因为hive是先join再where的,所以如果在b中找不到a表的记录,b表中的所以列都会列出null,包括ds列,这样left outer的查询结果与where子句无关了,解决办法:

SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key AND
a.dt=‘2014-08-07‘ AND b.dt=‘2014-08-07‘‘)

3.     怎样写exist/in子句?

Hive不支持where子句中的子查询,SQL常用的exist in子句需要改写。这一改写相对简单。考虑以下SQL查询语句:

SELECT a.key, a.value  FROM a  WHERE a.key in  (SELECT b.key  FROM B);

可以改写为

SELECT a.key, a.value  FROM a LEFT OUTER JOIN b ON (a.key = b.key)  WHERE b.key <> NULL;

一个更高效的实现是利用left semi join改写为:

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

4.     Hive join只支持等值连接,不支持非等值连接。

5.     合理的使用map join, 场合:小表A join 大表,

二、     合理设置map与reduce的个数。

1、如何合并小文件,减少map数?

如果一个表中的map数特别多,可能是由于文件个数特别多,而且文件特别小照成的,可以进行如下操作,合并文件,:

set mapred.max.split.size=100000000; // 100M

set mapred.min.split.size.per.node=100000000;

set mapred.min.split.size.per.rack=100000000;

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; //  合并小文件

2、如何适当的增加map数?

如果表A只有一个文件,大小为120M,包含几千万记录,可以考虑用多个map任务完成

set mapred.reduce.tasks=10;

create table a_1 as

select * from a

distribute by rand(123); //将a表的记录,随机的分散到包含10个文件的a_1表中

3、hive如何确定reduce数, reduce的个数基于以下参数设定:

hive.exec.reducers.bytes.per.reducer(每个reduce任务处理的数据量,默认为1000^3=1G)

hive.exec.reducers.max(每个任务最大的reduce数,默认为999)

计算reducer数的公式很简单N=min(参数2,总输入数据量/参数1)

即,如果reduce的输入(map的输出)总大小不超过1G,那么只会有一个reduce任务;所以调整以下参数:

set hive.exec.reducers.bytes.per.reducer=500000000; (500M)

set mapred.reduce.tasks = 15;

三、     如果设计和使用bucket,

Buckets 对指定列计算 hash,根据 hash 值切分数据,目的是为了并行,每一个 Bucket 对应一个文件。 将 user 列分散至 32 个 bucket, 首先对 user 列的值计算 hash,对应 hash 值为 0 的 HDFS 目录为:/wh/pvs/dt=2014-08-01/ctry=US/part-00000;
hash 值为 20 的 HDFS 目录为:/wh/pvs/dt=2014-08-01/ctry=US/part-00020

所用场合:对某一列进行分区,比如对用户ID进行分区,例如:

CREATE TABLE weblog (user_id INT, url STRING, source_ip STRING)

> PARTITIONED BY (dt STRING)

> CLUSTERED BY (user_id) INTO 96 BUCKETS; // 按照日期分区后,再按照user_id把日志放在96个篮子里。插入数据的时候:

hive> SET hive.enforce.bucketing = true;

hive> FROM raw_logs

> INSERT OVERWRITE TABLE weblog

> PARTITION (dt=‘2009-02-25‘)

> SELECT user_id, url, source_ip WHERE dt=‘2009-02-25‘

四、     Count(distinct)

当count distinct 的记录非常多的时候,设置以下两个参数:

hive>  hive.map.aggr = true

hive> set hive.groupby.skewindata=true;

hive>  select count (distinct gid) from cookie_label_summary where i_date=20130924;

五、     Group by

Group By的方法是在reduce做一些操作,这样会导致两个问题:

map端聚合,提前一部分计算:hive.map.aggr = true 同时设置间隔:hive.groupby.mapaggr.checkinterval

均衡处理:hive.groupby.skewindata

这是针对数据倾斜的,设为ture的时候,任务的reduce会把原来一个job拆分成两个,第一个的job中reduce处理处理不同的随即分发过来的key的数据,生成中间结果,再由最后一个综合处理。

六、     Order by, Sort by ,Dristribute by,Cluster By

1、     order by VS Sort by: order by是在全局的排序,只用一个reduce去跑,所以在set hive.mapred.mode=strict 模式下,order by 必须limit,否则报错。Sort by只保证同一个reduce下排序正确。

2、     Distribute by with sort by: Distribute by 是按指定的列把map 输出结果分配到reduce里。所以经常和sort by 来实现对某一字段的相同值分配到同一个reduce排序。

3、     Cluster by 实现了Distribute by+ sort by 的功能

HIVE优化提示-如何写好HQL

时间: 2024-10-10 16:55:00

HIVE优化提示-如何写好HQL的相关文章

Hive 12、Hive优化

要点:优化时,把hive sql当做map reduce程序来读,会有意想不到的惊喜. 理解hadoop的核心能力,是hive优化的根本. 长期观察hadoop处理数据的过程,有几个显著的特征: 1.不怕数据多,就怕数据倾斜. 2.对jobs数比较多的作业运行效率相对比较低,比如即使有几百行的表,如果多次关联多次汇总,产生十几个jobs,没半小时是跑不完的.map reduce作业初始化的时间是比较长的. 3.对sum,count来说,不存在数据倾斜问题. 4.对count(distinct )

hive优化之——控制hive任务中的map数和reduce数

一.    控制hive任务中的map数: 1.    通常情况下,作业会通过input的目录产生一个或者多个map任务.主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小(目前为128M, 可在hive中通过set dfs.block.size;命令查看到,该参数不能自定义修改): 2.    举例:a)    假设input目录下有1个文件a,大小为780M,那么hadoop会将该文件a分隔成7个块(6个128m的块和1个12m的块),从而产生7个map数

Hive优化总结

优化时,把hive sql当做map reduce程序来读,会有意想不到的惊喜. 理解hadoop的核心能力,是hive优化的根本.这是这一年来,项目组所有成员宝贵的经验总结. 长期观察hadoop处理数据的过程,有几个显著的特征: 1.不怕数据多,就怕数据倾斜. 2.对jobs数比较多的作业运行效率相对比较低,比如即使有几百行的表,如果多次关联多次汇总,产生十几个jobs,没半小时是跑不完的.map reduce作业初始化的时间是比较长的. 3.对sum,count来说,不存在数据倾斜问题.

Hive优化策略介绍

作为企业Hadoop应用的核心产品之一,Hive承载着公司95%以上的离线统计,甚至很多企业里的离线统计全由Hive完成: Hive在企业云计算平台发挥的作用和影响越来越大,如何优化提速已经显得至关重要: Hive作业的规模决定着优化层级,一个Hive作业的优化和一万个Hive作业的优化截然不同: 后续文章将从如下三个方面进行hive的优化介绍: 1)  架构方面(高效.全局.局部)----最有效的优化,好的架构能让作业性能提高很多 a)  分表:(日志表量大而且作业访问次数多,造成耗时较长:将

hive 优化 (转)

Hive优化 Hive优化目标 在有限的资源下,执行效率更高 常见问题 数据倾斜 map数设置 reduce数设置 其他 Hive执行 HQL --> Job --> Map/Reduce 执行计划 explain [extended] hql 样例 select col,count(1) from test2 group by col; explain select col,count(1) from test2 group by col; Hive表优化 分区 静态分区 动态分区 set

hive的基本语法汇总(hql)

2019/2/20 星期三 hive的基本语法汇总(hql)----------------------------------------------Hive学习3:Hive三种建表语句详解 https://blog.csdn.net/qq_36743482/article/details/78383964Hive建表方式共有三种:1.直接建表法例如:create table table_name(col_name data_type);2.查询建表法例如:通过AS 查询语句完成建表:将子查询

大数据技术之_08_Hive学习_04_压缩和存储(Hive高级)+ 企业级调优(Hive优化)

第8章 压缩和存储(Hive高级)8.1 Hadoop源码编译支持Snappy压缩8.1.1 资源准备8.1.2 jar包安装8.1.3 编译源码8.2 Hadoop压缩配置8.2.1 MR支持的压缩编码8.2.2 压缩参数配置8.3 开启Map输出阶段压缩8.4 开启Reduce输出阶段压缩8.5 文件存储格式8.5.1 列式存储和行式存储8.5.2 TextFile格式8.5.3 Orc格式8.5.4 Parquet格式8.5.5 主流文件存储格式对比实验8.6 存储和压缩结合8.6.1 修

大数据开发实战:Hive优化实战3-大表join大表优化

5.大表join大表优化 如果Hive优化实战2中mapjoin中小表dim_seller很大呢?比如超过了1GB大小?这种就是大表join大表的问题.首先引入一个具体的问题场景,然后基于此介绍各自优化方案. 5.1.问题场景 问题场景如下: A表为一个汇总表,汇总的是卖家买家最近N天交易汇总信息,即对于每个卖家最近N天,其每个买家共成交了多少单,总金额是多少,假设N取90天,汇总值仅取成交单数.A表的字段有:buyer_id. seller_id.pay_cnt_90day. B表为卖家基本信

Hive优化

概述: 一个Hive查询生成多个map reduec job,一个map reduce job又有map,reduce,spill,Shuffle,sort等几个阶段,所以针对Hive查询的优化可以大致分为针对MR中单个步骤的优化(其中又会分细节),针对MR全局的优化,和针对整个查询(多MR job)的优化,下文会分别阐述. 在开始之前先把MR的流程图贴出来(摘自Hadoop权威指南),方便后面对照.另外要说明的是,这个优化知识针对Hive0.9版本,而不是后来Hortonwork发起Sting