- hive为啥分区?
hive为了避免全表扫描,从而引进分区技术来将数据进行划分。减少不必要数据的扫描,从而提高效率。
- hive的分区和MySQL的分区的区别?
mysql分区字段用的是表内字段;而hive分区字段采用表外字段。
- hive的分区技术
- hive的分区字段是一个伪字段,但我们可以使用来进行操作
- 分区可以是表分区也可以是分区的分区,可以有多个分区
- 分区的关键字
partitioned by {字段 类型}
- 分区的本质是在表的目录或者是分区的目录下在创建目录,分区的目录名为指定字段=值
例如:
- 一级分区
create table if not exists u1(id int,name string,age int)partitioned by(dt string) //分区字段row format delimited fields terminated by ' ' //列分隔符stored as textfile; 存储类型
// 文件加载到分区表load data local inpath '/home/u1' into table u1 partition(dt="2018-10-14");load data local inpath '/home/u115' into table u1 partition(dt="2018-10-15");
- 二级分区
create table if not exists u2(id int,name string,age int)partitioned by(month int,day int)row format delimited fields terminated by ' 'stored as textfile;
// 文件加载到分区表load data local inpath '/home/u1914' into table u2 partition(month=9,day=14);load data local inpath '/home/u1915' into table u2 partition(month=9,day=15);load data local inpath '/home/u11014' into table u2 partition(month=10,day=14);load data local inpath '/home/u11015' into table u2 partition(month=10,day=15);
- 查询分区:
show partitions {tableName};
- 增加分区:
alter table u1 add partition(dt="2018-10-16"); // 一级分区alter table u1 add partition(dt="2018-10-16") partition(dt="2018-10-17"); //二级分区alter table u1 add partition(dt="2018-10-19") location "/user/hive/warehouse/gp1801.db/u1/dt=2018-10-16/"; //增加分区并指定数据文件路径
- 修改分区(手动修改元数据信息)
alter table u1 partition(dt="2018-10-16") rename to partition(dt="2018-10-26");
- 修改已存在分区的路径:
alter table u1 partition(dt="2018-10-19") set location "hdfs://qianfeng/user/hive/warehouse/gp1801.db/u1/dt=2018-10-14/"; //务必要写成绝对路径
- 删除分区
alter table u1 drop partition(dt="2018-10-27"); //删除一级分区alter table u1 drop partition(dt="2018-10-26"),partition(dt="2018-10-19"); //删除二级分区
- hvie的动态分区
hive.exec.dynamic.partition=true; //是否允许动态分区hive.exec.dynamic.partition.mode=strict/nostrict; //动态区模式为严格模式hive.exec.max.dynamic.partitions=1000; //允许最大的动态分区hive.exec.max.dynamic.partitions.pernode=100; //单个节点允许最大分区
strict:严格模式,最少需要一个静态分区列(指定固定值)nostrict:非严格模式,允许所有的分区字段都为动态。
- hive的静态分区:分区数据已知
- hive的动态分区:分区数据未知(不知道有多少个分区)
- hive的混合分区:有动态有静态
- 动态分区
create table if not exists u3(id int,name string,age int)partitioned by(month int,day int)row format delimited fields terminated by ' 'stored as textfile;将u2表中的数据加载到u3中:from u2insert into table u3 partition(month,day)select id,name,age,month,day;
- 混合分区:
create table if not exists u4(id int,name string,age int)partitioned by(month int,day int)row format delimited fields terminated by ' 'stored as textfile;from u2insert into table u4 partition(month=9,day)select id,name,age,daywhere month=9;
- hive的mr的执行模式
hive.mapred.mode=strict/nostrict; //严格模式/非严格模式