Hive高级用法01-hive调优

文章目录

1. 查看执行计划

    1.1 执行计划有什么用:
  • 查看SQL的执行流程,可分析优化是否有效
    1.2 怎么查询执行计划
explain [EXTENDED | DEPENDENCY | AUTHORIZATION] query sql
    1.3 简单示例

在这里插入图片描述

2.建表优化

      2.1 建分区表
         2.1.1 什么是分区表
  • 把一个大的数据集根据业务需要分割成小的数据集,分文件夹存储。通过查询指定文件夹可以减少数据的扫描 可以大大提高查询效率
         2.1.2 怎么建立分区表
create table dept_partition(
deptno int, dname string, loc string)
-- 分区字段不能是表中存在的 可以在将分区字段看成表的伪列
partitioned by (day string)
row format delimited fields terminated by '\t';

         2.1.3 分区表中加载数据必须指定分区
  • 方式1 查询结果插入(插入时 必须指定分区字段和字段名)
insert overwrite table dept_partition partition(day='2020-06-24') select id,uploader,relatedids from video;

  • 方式2 从文件中加载
hive (default)> load data local inpath
'/opt/module/ dept.log' into table dept_partition
partition(day ='2020-06-24')

         2.1.4 查询分区数据
select * from dept_partition where day='2020-06-24

在这里插入图片描述

         2.1.5分区表中加载数据必须指定分区
  • 增加减少分区
alter table dept_partition add partition(day='20200404')
-- 增加多个分区
alter table dept_partition add partition(day='20200404') partition(day='20200406')

-- 减少分区
alter table dept_partition drop partition (day='3434')
-- 删除多个分区
alter table dept_partition drop partition(day='20200404'),partition(day='20200405')
  • 查看表由多少个分区
 show partitions dept_partition;
         2.1.6 如果一天数据量过大可建立二级分区
  • 创建二级分区表
create table dept_partition2(
deptno int,
dname string,
loc string)
partitioned by (day string, hour string)
row format delimited fields terminated by '\t';
  • 加载数据
load data local inpath
'/opt/module data/dept _20200401.log ' into table
dept_partition2 partition(day ='20200401',hour='12')
         2.1.7 动态分区–对表进行insert时 根据分区字段的不同的值将数据插入的不同分区中
  • 1.和动态分区有关的参数
(1)开启动态分区功能(默认true 开启)
	set hive.exec.dynamic.partition=true
(2)必须改===设置为非严格模式(动态分区的模式,默认 strict ,表示必须指定至少一个分区为静态分区,
   nonstrict 模式表示允许所有的分区字段都可以使用动态分区) 
	set hive.exec.dynamic.partition.mode=nonstrict
(3)在所有执行 MR 的节点上,最大一共可以创建多少个动态分区。默认 1000
	set hive.exec.max.dynamic.partitions=1000
(4)在每个执行 MR 的节点上,最大可以创建多少个动态分区。该参数需要根据实际的数据来设定。比如:源数据中包含了一年的数据,即day字段有365个值,那么该参数就需要设置成大于365 ,如果使用默认值100 ,则会报错。
	set hive.exec.max.dynamic.partitions.pernode=100
(5)整个 MR Job 中,最大可以创建多少个 HDFS 文件。默认 100000
	set hive.exec.max.created.files=100000
(6)当有空分区生成时,是否抛出异常。一般不需 要设置。默认 false
	set hive.error.on.empty.partition=false
  • 案例
    • 需求:将dept表中的数据按照地区 loc字段 插入到目标表 dept_partition的相应分
      区中。
(1) 创建目标分区表
	 create table dept_partition _dy (id int, name string)
partitioned by ( loc int) row format delimited fields terminated by ' t';
(2)设置动态分区
	 set hive.exec.dynamic.partition.mode = nonstrict;
	insert into table dept_partition _dy partition( loc ) select
deptno, dname, loc from dept;3) 查看目标分区表的分区情况
	 show partitions dept_partition;
      2.2 建分桶表
         2.2.1 什么是分桶表?
  • 分桶可以理解为MapReduce中的HashPartitioner的原理。都是基于hash值对数据进行分桶。MR:按照key的hash值除以reduceTask个数进行取余(reduce_id = key.hashcode % reduce.num)
  • Hive:按照分桶字段(列)的hash值除以分桶的个数进行取余(bucket_id = column.hashcode % bucket.num)
         2.2.2 怎么创建分桶表
  • 开启分桶
set hive.enforce.bucketing = true;   开启强制分桶
  • 数据准备
-- 数据
1010 ss10
1011 ss11
1012 ss12
1002 ss2
1003 ss3
1004 ss4
1005 ss5
1013 ss13
1016 ss16
1001 ss1
1006 ss6
1007 ss7
1008 ss8
1014 ss14
1015 ss15
1009 
  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值