1 分区表
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
1.1 分区表
在建表时,指定了PARTITIONED BY ,这个表称为分区表
PARTITIONED BY 以什么分区
1.2 分区概念
MR: 在MapTask输出key-value时,为每个key-value计算一个区号,同一个分区的数据,会被同一个reduceTask处理
这个分区的数据,最终生成一个结果文件!
通过分区,将MapTask输出的key-value经过reduce后,分散到多个不同的结果文件中!
Hive: 将表中的数据,分散到表目录下的多个子目录(分区目录)中
1.3 分区意义
- 分区的目的是为了就数据,分散到多个子目录中,在执行查询时,可以只选择查询某些子目录中的数据,加快查询效率!
- 只有分区表才有子目录(分区目录)
- 分区目录的名称由两部分确定: 分区列列名=分区列列值
- 将输入导入到指定的分区之后,数据会附加上分区列的信息!
- 分区的最终目的是在查询时,使用分区列进行过滤!
2 分区表操作
2.1 创建分区表
多级分区表,有多个分区字段
create external table if not exists learnwork.deptpart2(
deptno int,
dname string,
loc int
)
PARTITIONED BY(area string,province string)
row format delimited fields terminated by '\t';
create external table if not exists learnwork.deptpart3(
deptno int,
dname string,
loc int
)
PARTITIONED BY(area string)
row format delimited fields terminated by '\t'
location 'hdfs://hadoop101:9000/deptpart3';
2.2 分区的查询
show partitions 表名
2.3 创建分区
alter table 表名 add partition(分区字段名=分区字段值) ;
- 在hdfs上生成分区路径
- 在mysql中metastore.partitions表中生成分区的元数据
- 直接使用load命令向分区加载数据,如果分区不存在,load时自动帮我们生成分区
- 如果数据已经按照规范的格式,上传到了HDFS,可以使用修复分区命令自动生成分区的元数据
msck repair table 表名;
注意事项:
- 如果表是个分区表,在导入数据时,必须指定向哪个分区目录导入数据
- 如果表是多级分区表,在导入数据时,数据必须位于最后一级分区的目录
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。