hive的优化方案

1.优化之分区

对数据进行分区,可以将数据以一种符合逻辑的方式进行组织(比如分层存储),同时极大提高查询性能。
在创建表的时候,根据后续查询需求’PARTITIOED BY( )'对数据进行合理的分区,下面我们根据‘province’和‘city’进行对数据进行分区分区:

CREATE TABLE IF NOT EXISTS tbl_per_info (no INT, name STRING, sex STRING, age INT, salary FLAOT) PARTITIONED BY (province STRING, city STRING);

'province’和’city’已经在文件目录名称中了,不需要再把这些值放在目录下的文件中,浪费空间。当我们需要查询在山东德州的员工个人信息时:

SELECT * FROM tbl_per_info WHERE province = '山东省' AND city = '德州市'

这时查询仅仅需要扫描山东省德州市这一个目录,其他省市的数据就都被忽略了。

2.优化之join

Hive 默认查询中最后一个表是最大的表。在对每行记录进行连接操作时,会尝试将其他表缓存起来,然后扫描最后的表进行计算。

SELECT s.no, s.name, q.data FROM infos a JOIN datatime q ON s.no = q.no

这里datatime这张表应该比info大。
在Hive里提供了一个“标记”机制来显式地告之优化器哪张表是大表,,这是不必在意表的前后问题:

SELECT /*+STREAMTABLE(q)*/ s.no, s.name, q.data FROM infos a JOIN datatime q ON s.no = q.no

如果所有表中只有一个小表,那么可以在最大表通过mapper的时候将小表完全放到内存中

set hive.auto.convert.join=true;
set jive.mapjoin.smalltable.filesize=fizesize;

通过第一个属性设置来启用map_side JOIN,第二个属性可以配置优化的小表的大小filesize

3.优化之本地模式

当数据集非常小时,通过本地模式在单台机器上处理所有任务,可以面下缩短执行时间,可以通过设置以下参数临时启用本地模式

set hive.exec.mode.local.auto=true;

4.优化之并行执行

Hive会将一个查询转化成多个阶段,包括MapReduce、limit、合并等,但一般一次只会执行一个阶段。当一些阶段不是完全依赖的时候,其实是可以并行执行的,这样job工作可以更快的完成。

set hive.exec.paralle=true;

5.优化之严格模式

通过设置下面的属性,可以启用严格模式,帮助我们避免执行一些不好的查询,包括:

(1)对于分区表,WHERE语句中没有分区字段过滤条件来限制查询范围;

(2)使用ORDER BY,而使用LIMIT;

(3)笛卡尔积查询。

set hive.mapred.mode=strict;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值