分区表(重要):
**分区:**就是在表的目录下根据一些特定的条件再创建一些子目录,这些子目录下有我们原始数据的划分号的一部分数据。
查询时我们可以通过分区列和常规列来查询,大大提高查询速度。
分区又分为是动态分区和静态分区
但是不管是静态还是动态,都要先创建分区表(创表方式一样):
最好创建外部表,安全,
create external table if not exists A(
id string,
name string,
age string
)
partitioned by (sex string)
row format delimited
fields terminated by ','
stored as textfile;
location '表数据目录';
注意:根据创建的表中的某个字段进行分割时,在创建表时不可以在添加这个字段,如上表中根据sex分区,创建的表的字段不能再有sex
表创建完成后,我们要导入数据,然后映射出一张表,供我们后期使用:
此时静态分区和动态分区才会有很大的不同,或者说是依据导数据的方式来判断 是动态分区还是静态分区:
静态分区:
如果是一个完整的大文件
此时可以使用如下方法导入:
//注意查询的字段要与创建分区表时的字段一致
//产生一级子目录,需手动创建每一个分区,当分区交多时,麻烦
insert into employee_hrpar partition(sex='male') select id,username,bir from ods_users where sex='male';
insert into employee_hrpar partition(sex='female') select id,username,bir from ods_users where sex='female';
load data local inpath '/opt/datas/dept.txt' into table ods_users partition(sex='male');
//产生二级子目录
insert into empar partition (year=2015,month=11) select name,id,number from employee_hr where year(start_date)=2015 and month(start_date)=11;
load data local inpath '/opt/datas/dept.txt' into table dept_partition2 partition(year='2019', month='12');
动态分区:
首先设置这两个配置:(短暂性设置,关闭后需重新设置)
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
创建分区表都是上面的创建方式
添加数据的方式如下:
再次之前可以使用groupby 或者 distinct 了解下数据信息,方便下面的分区.
方式:
//不需要手动一个一个分区,可以根据关键字自动分区。
//此时select中的字段要和创建表时的字段加上partition的关键字的一致。根据一个字段分区
insert into myuser partition(sex) select * from ods_users;
//根据两个字段分区
insert into empar partition(year,month) select name,id,number,year(start_date),month(start_date) from employee_hr;
静态分区:是自己定义数据 多用于增量表(不断增加表的内容)比如新闻表,每天都会变化增加需要事先知道有多少分区,每个分区都要手动插入。
动态分区:事先先用group 或者distinct 看一下字段值的种类
多用于每年 每月 每日 等 多用于全量导入 数据量不能太大