目录
一:分区的概念和分区表
分区表指的是在创建表时指定分区空间,实际上就是在hdfs上表的目录下再创建子目录。
在使用数据时如果指定了需要访问的分区名称,则只会读取相应的分区,避免全表扫描,提高查询效率。
分区表实际上是在表的目录下再以分区命名,建子目录
作用:进行分区裁剪,避免全表扫描,减少MapReduce处理的数据量,提高效率
一般在公司的hive中,所有的表基本上都是分区表,通常按日期分区、地域分区
分区表在使用的时候记得加上分区字段
分区也不是越多越好,一般不超过3级,根据实际业务衡量
create external table 表名
(
字段名1 字段类型1,
字段名2 字段类型2,
...
)pratition by (分区字段 字段类型)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '分隔符' // 必选指定列之间的分隔符
STORED AS file_format
location 'HDFS路径';
注意: 分区字段和普通字段没区别(不能重复)
二:对分区的操作
添加分区:
alter table 表名 add partition(分区字段='值');
删除分区:
alter table 表名 drop partition(分区字段='值');
查看分区:
show partitions 表名; // 推荐这种方式(直接从元数据中获取分区信息)
select distinct pt from 表名; // 不推荐
插入数据:
insert into table 表名 partition(pt='20210902') select * from表名;
load data local inpath '路径' into table 表名 partiton(分组字段='值');
分区不存在自动创建
查询某个分区的数据
// 全表扫描,不推荐,效率低
select count(*) from 表名 ;
// 使用where条件进行分区裁剪,避免了全表扫描,效率高
select count(*) from 表名 where pt='20210101';
// 也可以在where条件中使用非等值判断
select count(*) from 表名 where pt<='20210112' and pt>='20210110';
三:Hive动态分区
1:概念
有的时候我们原始表中的数据里面包含了 ''日期字段 dt'',我们需要根据dt中不同的日期,分为不同的分区,将原始表改造成分区表。 hive默认不开启动态分区 动态分区:根据数据中某几列的不同的取值 划分 不同的分区
2:开启动态分区支持
hive>set hive.exec.dynamic.partition=true;
hive>set hive.exec.dynamic.partition.mode=nostrict;
hive>set hive.exec.max.dynamic.partitions.pernode=1000;
3:操作语句
insert into table 分区表 partition (分区字段) select id,name,age,gender,clazz,date from 原表;
开启后,查询的语句中最后的对应的字段作为动态分区的字段,会按照这个字段进行分区,相同的值会放到同一个分区
注意:1:分区字段不会按照名字匹配,按照位置(匹配查询到的最后一个字段) 匹配的是位置不是字段
2:先建立原始表然后加载数据在建立分区表进行插入数据
3:分区字段需要放在 select 的最后,如果有多个分区字段 同理,它是按位置匹配,不是按名字匹配