Hive优化

  • 首先说下优化的点,从哪些方面着手:主要是SQL不同写法,还有有就是对Hadoop 、MapReduce、HDFS的理解,调整相应的参数,以下结合我工作中的使用和个人的理解整理的,个人水平有限,欢迎指正,共同学习。

  • SQL 会用explain

  • 队列设置

  • 本地模式和并行模式

  • 设置maper和reducer的个数

  • JVM重用
    在这里插入图片描述

  • 索引

  • 动态分区调整:静态分区和动态分区

    Hive的分区方式:由于Hive实际是存储在HDFS上的抽象,Hive的一个分区名对应HDFS上的一个目录名,子分区名就是子目录名,并不是一个实际字段。

    分区的好处
    产生背景:如果一个表中数据很多,我们查询时就很慢,耗费大量时间,如果要查询其中部分数据该怎么办呢,这是我们引入分区的概念。
    Partition:分区,每张表中可以加入一个分区或者多个,方便查询,提高效率;并且HDFS上会有对应的分区目录:
    语法: Hive分区是在创建表的时候用Partitioned by 关键字定义的,但要注意,Partitioned by子句中定义的列是表中正式的列,但是Hive下的数据文件中并不包含这些列,因为它们是目录名,真正的数据在分区目录下。
    静态分区和 动态分区的区别,创建表的语法都一样

静态分区: 加载数据的时候要指定分区的值(key=value),比较麻烦的是每次插入数据都要指定分区的值,创建多个分区多分区一样,以逗号分隔。
动态分区: 如果用上述的静态分区,插入的时候必须首先要知道有什么分区类型,而且每个分区写一个load data,太烦人。使用动态分区可解决以上问题,其可以根据查询得到的数据动态分配到分区里。其实动态分区与静态分区区别就是不指定分区目录,由系统自己选择。

首先,启动动态分区功能 Hive默认是静态分区
	
hive> set hive.exec.dynamic.partition=true;
hive> set hive.exec.dynamic.partition.mode=nonstrict

--采用动态方式加载数据到目标表 
--加载之前先设置一下下面的参数
--开始加载
insert into table emp_dynamic_partition partition(deptno)
select empno , ename , job , mgr , hiredate , sal , comm, deptno from emp;

-- 删除分区 
alter table my_partition_test_table DROP IF EXISTS PARTITION (day='2018-08-08');

在这里插入图片描述

  • 推测执行
  • 数据倾斜
count(distinct columnName)

改为group by columnName

参考阅读

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值