hive调优----查询条件

数据处理中,不怕数据量大,就怕数据倾斜

1、慎重使用count(distinct col)

distinct会将col列所有数据保存在内存中,形成一个类似hash的结构,速度很快;但是在大数据背景下,因为col列所有值都会形成以key值,极有可能发生OOM(内存用完)

解决方案:

可以考虑使用Group By 或者 ROW_NUMBER() OVER(PARTITION BY col)方式代替COUNT(DISTINCT col)

2、小文件会造成资源的多度占用,影响查询效率

原因:

1>小文件在HDFS存储中会占用过多的内存空间,在MP查询过程中,过多的小文件会造成启动过多的Mapper Task ,每个Mapper 都是一个线程后台,会占用JVM的空间

2>动态分区会造成在插入数据过程中,生成过多零碎的小文件

3>不合理的Reducer Task数量的设置也会造成小文件的生成,因为最终Reducer是将数据落地到HDFS中的

解决方案:

在数据源头HDFS中控制小文件产生的个数

~1采用Sequencefile作为表存储格式,不要用textfile,在一定程度上可以减少小文件(常见于在流计算的时候采用Sequencefile格式进行存储)

~2减少reduce的数量(可以使用参数进行控制)

~3慎重使用动态分区,最好在分区中指定分区字段的val值

~4做好数据的校验工作,比如通过脚本方式检测hive表的文件数量,并进行文件合并

~5合并多个文件数据到一个文件中,重新构建表

3、慎重使用select * 

原因:

大数据量多字段的表中,使用 SELECT * 方式去查询数据,会造成很多无效数据处理,会占用程序资源,造成资源浪费

解决方案:

查询数据表时,指定所需的待查字段名,而非使用 * 号

4、不要在表关联后面加where条件

比如以下语句:

SELECT * FROM stu as t

LEFT JOIN course as t1

ON t.id=t2.stu_id

WHERE t.age=18;

解决方案:

采用谓词下推的技术,提早进行过滤有可能减少必须在数据库分区之间传递的数据量

谓词下推的解释:

所谓谓词下推就是通过嵌套的方式,将底层查询语句尽量推到数据底层去过滤,这样在上层应用中就可以使用更少的数据量来查询,这种SQL技巧被称为谓词下推(Predicate pushdown)

那么上面语句就可以采用这种方式来处理:

SELECT * FROM (SELECT * FROM stu WHERE age=18) as t

LEFT JOIN course AS t1

on t.id=t1.stu_id

5、处理掉字段中带有空值的数据

原因:

一个表内有许多空值时会导致MapReduce过程中,空成为一个key值,对应的会有大量的value值, 而一个key的value会一起到达reduce造成内存不足

解决方式:

1>在查询的时候,过滤掉所有为NULL的数据

select n.* from

(select * from res where id is not null ) n

left join org_tbl o on n.id = o.id;

2>查询出空值并给其赋上随机数,避免了key值为空(数据倾斜中常用的一种技巧)

select n.* from res n

full join org_tbl o on

case when n.id is null then concat('hive', rand()) else n.id end = o.id;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值