文章目录

  • 分区目的
  • 分区的创建
  • 1.创建建表时候不管动态还是静态分区
  • 2.执行load 装载数据
  • 3.查看表结构,查询分区表的数据
  • 4.静态分区:
  • 5.动态分区:
  • 多分区
  • 表分区的增删改查


分区目的

-分区主要用于提高性能
-分区列的值将表划分为一个个的文件夹
-查询时语法使用"分区"列和常规列类似
-查询时Hive会只从指定分区查询数据,提高查询效率
-分为静态分区和动态分区

分区的创建

Hive创建分区时,是通过partitioned by关键字进行创建,要注意的是这个关键字定义的列是表中正式的列,不能与表中其他列名重复,他们是目录(分区)名,目录下放的才是数据。分区字段不能与表中其他字段重复,否则会报错

1.创建建表时候不管动态还是静态分区

create table userinfos(
	userid string,
	age string,
	birthday string) 
partitioned by (sex string) 
row format delimited fields terminated by ',' 
stored as textfile;

2.执行load 装载数据

(其实load操作相当于把文件移动到HDFS的Hive目录下)

这种方式不合理直接忽略了性别,在查的时候强行改变该列的值但是原数据没有改变

load data local inpath '/opt/datas/user.csv' overwrite into table userinfos partition (sex='male');

3.查看表结构,查询分区表的数据

desc userinfos;
select * from userinfos;

4.静态分区:

指定分区就忽略该字段强行为分区值
场景:增量表

create table ods_users(
userid string,
username string,
birthday string,
sex string 
)
row format delimited fields terminated by ',' 
location '/pw';

插入数据

insert into userinfos partition(sex='male') select userid,username,birthday from ods_users where sex='male';
insert into userinfos partition(sex='female') select userid,username,birthday from ods_users where sex='female';

by hive partition 取均值 hive中partition by_数据

5.动态分区:

如果用上述的静态分区,插入的时候必须首先要知道有什么分区类型,而且每个分区写一个load data,太烦人。使用动态分区可解决以上问题,其可以根据查询得到的数据动态分配到分区里。其实动态分区与静态分区区别就是不指定分区目录,由系统自己选择。
场景:数据量较小,全量导入
步骤

create table myusers( 
userid string,
username string,
birthday string
) 
partitioned by (sex string)
row format delimited fields terminated by ','
 stored as textfile;

by hive partition 取均值 hive中partition by_字段_02


1.开启动态(因为默认就是静态)

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

2.插入数据(不指定分区值,该字段相同值就会分为一个分区)

insert into myusers partition(sex) select * from ods_users;

3.加快查询速度,分区表和其他表没有区别

select count(*) from myusers where sex='male';

多分区

1.创建多分区表

CREATE  TABLE IF NOT EXISTS employee_partitioned (
    name string,
    work_place ARRAY<string>,
    sex_age STRUCT<sex:string,age:int>,
    skills_score MAP<string,int>,
    depart_title MAP<STRING,ARRAY<STRING>>
)
partitioned by (year int,mouth int) 
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':'
STORED AS TEXTFILE
;

2.添加和删除多分区

alter table employee_partitioned add
partition (year=2019,mouth=7)
partition (year=2020,mouth=7)
partition (year=2020,mouth=8)
;

alter table employee_partitioned drop
partition (year=2019,mouth=7)
;

表分区的增删改查

1.添加分区

alter table userinfos add partition (sex='female');

2.删除分区

alter table userinfos drop partition (sex='female');

3.查询分区

show partitions userinfos;

4.修复分区
修复分区就是重新同步hdfs上的分区信息。

msck repair table userinfos;