hive中的分区
hive在的分区有两种:
1.静态分区
2.动态分区
两者的主要思想是相同的,这是做一件事情的两种方法
创建静态分区表:
create table if not exists dept (col1 int,col2 string,col3 string,col4 int) row format delimited fields terminated by’,’ lines terminated by’\n’stored as textfile;
Partitioned table
create table if not exists part_dept (deptno int,empname string,sal int) partitioned by (deptname string) row format delimited fields terminated by’,’ lines terminated by’\n’stored as textfile;
Static partitioning Load
insert into table part_dept partition (deptname = ‘HR’) select col1,col3,col4 from dept where col2 = ‘HR’; load data local inpath’/home/jivesh/act’into table part_tab partition( deptname =‘XZ’);
动态分区:
默认情况下,Hive中禁用动态分区,因此,首先需要在hive中使动态有效
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
现在创建动态表:
create table if not exists part_dept1 (deptno int,empname string,sal int) partitioned by (deptname string) row format delimited fields terminated by’,’ lines terminated by’\n’stored as textfile;
Dynamic partitioning Load
insert into table part_dept1 partition (deptname) select col1,col3,col4,col2 from dept;
删除分区:
drop partitionalter table part_dept1 drop partition (deptname = ‘HR’);
添加分区:
alter table part_dept1 add partition (deptname = ‘Dev’);
load data local inpath’/home/jivesh/dev’into table part_dept1 partition( deptname =‘Dev’);
msck repair table part_dept1;
静态与动态的区别:
在静态中,需要事先掌握数据知识。因此,如果事先掌握数据知识,那么我们可以使用静态分区。但是在静态分区中,我们手动进行分区。因此,如果数据较少,那么静态分区较好。
但是如果我们事先并没有数据知识,并且拥有更多唯一数据,则动态分区比静态分区更适合
在表的内部,我们创建了许多目录。如果我直接在HDFS中再创建一个目录,则hive会辨别它是否是分区
默认情况下,hive将这个目录视为分区。
我们可以通过两种方式推动hive对其的识别
1.添加分区
2.通过使用msck repair命令