Hive中的分区表

版权声明:Please make the source marked https://blog.csdn.net/qq_31807385/article/details/84678974

目录

总结:

分区结构图和原理:

上手案例实操: 

总结:


总结:

①创建分区表的时候,指定非表字段的分区字段,使用partitioned by ;②向分区表中插入数据的时候,在表名的后面要加上partition(分区字段名=分区字段值)③如果一个表是分区表,那么该分区表在HDFS上是一个以表名为名的路径,那么同时,该路径下还有分区的路径,以分区字段=分区字段值的形式命名。④使用where来进行分区查询。⑤alter add多个用空格,alter drop 多个用逗号。⑥:分区的目的是提高查询效率

分区结构图和原理:

分区表实际上就是对应一个HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过WHERE子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多。

分区表的目的是为了提高查询效率。

上手案例实操: 

1,创建分区表:分区的字段不能是表中的字段
create table stu_par(id int,name string)
partitioned by (month string)  
row format delimited
fields terminated by '\t';

使用下面的命令查看该表分区的字段
0: jdbc:hive2://hadoop108:10000> desc formatted stu_par;

2,向分区表中导入数据:
 load data local inpath '/opt/module/hive/stu.txt' into table stu_par partition(month = '12');

0: jdbc:hive2://hadoop108:10000> select * from stu_par;
OK
+-------------+---------------+----------------+--+
| stu_par.id  | stu_par.name  | stu_par.month  |
+-------------+---------------+----------------+--+
| 1001        | zhangfei      | 12             |
| 1002        | liubei        | 12             |
| 1003        | guanyu        | 12             |
| 1004        | zhaoyun       | 12             |
| 1005        | caocao        | 12             |
| 1006        | zhouyu        | 12             |
+-------------+---------------+----------------+--+
发现分区的字段信息也作为表的字段信息显示出来,所以分区字段得名虚字段。

3,继续执行:
load data local inpath '/opt/module/hive/stu.txt' into table stu_par partition(month = '11');

load data local inpath '/opt/module/hive/stu.txt' into table stu_par partition(month = '10');

4,查看HDFS中的表信息:
0: jdbc:hive2://hadoop108:10000> !sh hadoop fs -ls /user/hive/warehouse/db_hive.db/stu_par
Found 3 items
drwxr-xr-x   - isea supergroup      0 2018-12-01 04:34 /user/hive/warehouse/db_hive.db/stu_par/month=10
drwxr-xr-x   - isea supergroup      0 2018-12-01 04:34 /user/hive/warehouse/db_hive.db/stu_par/month=11
drwxr-xr-x   - isea supergroup      0 2018-12-01 04:30 /user/hive/warehouse/db_hive.db/stu_par/month=12

可以看出分区表会根据分区的字段和分区字段值的形式,组成  字段=字段值 的形式形成一个文件夹,在该
文件夹下存储着分区字段的信息

5,查询某个分区的字段使用where:
0: jdbc:hive2://hadoop108:10000> select * from stu_par where month = 10;
OK
+-------------+---------------+----------------+--+
| stu_par.id  | stu_par.name  | stu_par.month  |
+-------------+---------------+----------------+--+
| 1001        | zhangfei      | 10             |
| 1002        | liubei        | 10             |
| 1003        | guanyu        | 10             |
| 1004        | zhaoyun       | 10             |
| 1005        | caocao        | 10             |
| 1006        | zhouyu        | 10             |
+-------------+---------------+----------------+--+

6,查询表的分区情况:
0: jdbc:hive2://hadoop108:10000> show partitions stu_par;
OK
+------------+--+
| partition  |
+------------+--+
| month=10   |
| month=11   |
| month=12   |
+------------+--+

6,多分区查询可以使用union,要使用MapReduce:
select * from stu_par where month = 10
union
select * from stu_par where month = 11;

+---------+-----------+------------+--+
| _u2.id  | _u2.name  | _u2.month  |
+---------+-----------+------------+--+
| 1001    | zhangfei  | 10         |
| 1001    | zhangfei  | 11         |
| 1002    | liubei    | 10         |
| 1002    | liubei    | 11         |
| 1003    | guanyu    | 10         |
| 1003    | guanyu    | 11         |
| 1004    | zhaoyun   | 10         |
| 1004    | zhaoyun   | 11         |
| 1005    | caocao    | 10         |
| 1005    | caocao    | 11         |
| 1006    | zhouyu    | 10         |
| 1006    | zhouyu    | 11         |
+---------+-----------+------------+--+

7,增加,和删除多个分区:增加空格,删除逗号:
增加分区,多个
alter table stu_par add partition(month = '09') partition(month = '08');
删除分区,多个
alter table stu_par drop partition(month = '09'),partition(month = '08');

8,创建多级分区,在HDFS上,二级分区将会是一级分区的子文件夹:
> load data local inpath '/opt/module/hive/stu.txt' into table stu_par2 partition(month = '12', day = '01');

0: jdbc:hive2://hadoop108:10000> select * from stu_par2;
OK
+--------------+----------------+-----------------+---------------+--+
| stu_par2.id  | stu_par2.name  | stu_par2.month  | stu_par2.day  |
+--------------+----------------+-----------------+---------------+--+
| 1001         | zhangfei       | 12              | 01            |
| 1002         | liubei         | 12              | 01            |
| 1003         | guanyu         | 12              | 01            |
| 1004         | zhaoyun        | 12              | 01            |
| 1005         | caocao         | 12              | 01            |
| 1006         | zhouyu         | 12              | 01            |
+--------------+----------------+-----------------+---------------+--+

增加分区,获取分区信息:
> alter table stu_par2 add partition(month = '12',day = '02');
0: jdbc:hive2://hadoop108:10000> show partitions stu_par2;
OK
+------------------+--+
|    partition     |
+------------------+--+
| month=12/day=01  |
| month=12/day=02  |
+------------------+--+

alter table stu_par2 add partition(month = '12',day = '02');
就是在Metastore中的partition表中添加了一个字段的信息,如下图:

如下图:

总结:

①创建分区表的时候,指定非表字段的分区字段,使用partitioned by ;②向分区表中插入数据的时候,在表名的后面要加上partition(分区字段名=分区字段值)③如果一个表是分区表,那么该分区表在HDFS上是一个以表名为名的路径,那么同时,该路径下还有分区的路径,以分区字段=分区字段值的形式命名。④使用where来进行分区查询。⑤alter add多个用空格,alter drop 多个用逗号;⑥分区的目的是为了提高查询效率

猜你喜欢

转载自blog.csdn.net/qq_31807385/article/details/84678974