1. 查看执行计划
1.1 执行计划有什么用:
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;
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 ) 开启动态分区功能( 默认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