文章预览:

  • 1.创建分区表
  • 2.给表中装入数据
  • 3.分区表常用的语法
  • 1.LOAD
  • 2.添加分区
  • 3.删除分区
  • 4.查看一张表的分区
  • 5.导入数据
  • 6.动态分区
  • 动态分区注意点


1.创建分区表

参考官网:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL 需要在之前的基础之上增加PARTITIONED BY语句,如下图:

drop hive table 分区 hive load分区表_分区表


例:创建一个带分区的表

create table dept_partition(   
deptno int,
dname string,
loc string
)
PARTITIONED BY (day string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

2.给表中装入数据

1.接下来给分区表中LOAD数据,而LOAD数据语句参考官网如下:

LOAD DATA [LOCAL] INPATH ‘filepath’ [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 …)]

LOAD DATA LOCAL INPATH '/home/hadoop/data/partition/dept_20300502.txt' OVERWRITE INTO TABLE dept_partition PARTITION (day=20300502);

操作步骤如下图:

drop hive table 分区 hive load分区表_数据_02


当完成以上步骤之后,数据在HDFS上的表现形式如下图:

drop hive table 分区 hive load分区表_数据_03

由以上的结果看出,分区表实际上就是在表所在的文件夹下又新创建了一个文件夹,那么我们能不能直接在hdfs上通过mkdir创建一个文件夹,然后put一下数据上去行不行呢?接着往下:

2.手动创建文件夹以及put数据,操作如下图:

drop hive table 分区 hive load分区表_分区表_04


3.为什么会出现上边的现象呢?因为Hive是由Hadoop和元数据库组成的,而Hive的查询数据肯定是先要经过元数据库查询数据在哪个路径以及分区等信息之后通过查到的信息才能正确的查询到数据。所以我们打开元数据库,里边有一张表partitions,这个里边就记录的是表的分区信息。

drop hive table 分区 hive load分区表_Hive_05


刷新之后:

drop hive table 分区 hive load分区表_数据_06


另外注意:

MSCK REPAIR TABLE dept_partition;这种方式也可以刷新元数据,但是他是全表级别的刷新。生产上慎用!!!

3.分区表常用的语法

以下来自官网

1.LOAD

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

例:LOAD DATA LOCAL INPATH '/home/hadoop/data/partition/dept_20300502.txt' OVERWRITE INTO TABLE dept_partition PARTITION (day=20300502);

2.添加分区

ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location'][, PARTITION partition_spec [LOCATION 'location'], ...];

partition_spec:
  : (partition_column = partition_col_value, partition_column = partition_col_value, ...)

例:ALTER TABLE dept_partition ADD PARTITION (day='20300503');  #一级分区
    LOAD DATA LOCAL INPATH '/home/hadoop/data/partition/dept_20300502.txt' OVERWRITE INTO TABLE dept_partition_d_h PARTITION (day='20300502', hour='21'); #多级分区

3.删除分区

ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec[, PARTITION partition_spec, ...]
[IGNORE PROTECTION] [PURGE];            -- (Note: PURGE available in Hive 1.2.0 and later, IGNORE PROTECTION not available 2.0.0 and later)

例:ALTER TABLE dept_partition DROP PARTITION(day='20300503'); #删除一级分区
ALTER TABLE dept_partition DROP PARTITION(day='20300503'),PARTITION(day='20300502'); #删除多级分区

4.查看一张表的分区

show partitions table_name;

5.导入数据

insert into/overwrite table dept_partition partition(day='20300505')
select * from dept;

6.动态分区

操作如下:

drop hive table 分区 hive load分区表_分区表_07

动态分区注意点

1.需要将严格模式设置成非严格模式;
2.select的语句中,必须将对应分区的字段放到最后一个字段上。