分区表
- 介绍
1
2
3
4
5
6在Hive中处理数据时,当处理的一张表的数据量过大的时候,每次查询都是遍
历整张表,显然对于计算机来说,是负担比较重的。所以我们可不可以针对数
据进行分类,查询时只遍历该分类中的数据,这样就能有效的解决问题。所以
就会Hive在表的架构下,就会有分区的这个概念,就是为了满足此需求。
- 分区表的一个分区对应hdfs上的一个目录
分区表的创建
1
2
3
4
5
6
7
8
9
10create table order_partition(
ordernumber string,
eventtime string
)
partitioned by (event_month string)
row format delimited fields terminated by '\t';
- 在建表时,我们使用partitioned by来定义分区
- 多级分区
如果建表的时候partitioned by (event_month string,loc string)了多个字段,就是一个多级分区,体现到hdfs上,会建立多级目录查看表结构
1
2
3
4
5
6
7当指定分区后,我们再查看表结构的时候可以看到,添加了对应的字段
hive> desc order_partition;
# Partition Information
# col_name data_type comment
event_month string导入数据
1
2
3
4
5
6
7
8
9
10
11
12- 基础数据
/home/hadoop/data/order.txt
10703007267488 2014-05-01 06:01:12.334+01
10101043505096 2014-05-01 07:28:12.342+01
10103043509747 2014-05-01 07:50:12.33+01
10103043501575 2014-05-01 09:27:12.33+01
10104043514061 2014-05-01 09:03:12.324+01
- 导入数据:这里导入数据的时候通过partition指定了对应的分区
load data local inpath '/home/hadoop/data/order.txt' overwrite into table order_partition partition(event_month='2014-05');
load data local inpath '/home/hadoop/data/order.txt' overwrite into table order_partition partition(event_month='2014-06');
load data local inpath '/home/hadoop/data/order.txt' overwrite into table order_partition partition(event_month='2014-07');
1
可以看到,在hdfs上分别建立了对应的文件夹
- 查询数据
1
2
3
4
5
6
7
8
9
10hive> select * from order_partition where event_month='2014-06';
OK
order_partition.order_no order_partition.event_time order_partition.event_month
10703007267488 2014-05-01 06:01:12.334+01 2014-06
10101043505096 2014-05-01 07:28:12.342+01 2014-06
10103043509747 2014-05-01 07:50:12.33+01 2014-06
10103043501575 2014-05-01 09:27:12.33+01 2014-06
10104043514061 2014-05-01 09:03:12.324+01 2014-06
这里可以看到,我们可以正常的使用event_month字段进行查询操作
动态分区表
这里我们复用之前实验用的emp表,使用show create table table_name;查看建表语句
1
2
3
4
5
6
7
8
9
10
11
12
13CREATE TABLE `emp_partition`(
`empno` int,
`ename` string,
`job` string,
`mgr` int,
`hiredate` string,
`sal` double,
`comm` double)
PARTITIONED BY(deptno int)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';
- 注意:这里我们去掉了deptno字段,将其改为分区字段修改动态分区模式为非严格模式
1
set hive.exec.dynamic.partition.mode=nonstrict;
动态导入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25INSERT INTO TABLE emp_partition
partition(deptno)
select * from emp;
- 查询一下数据就可以发现数据已经导入进去了
这里我们在导入数据的时候不需要partition(deptno='')
hive会根据我们后面的查询字段,自动将deptno字段分配给deptno分区
** 在开发中,我们经常会使用这种方式
- 到mysql中查看是否真的创建成功了
mysql> select * from PARTITION_KEY_VALS;
+---------+----------------------------+-------------+
| PART_ID | PART_KEY_VAL | INTEGER_IDX |
+---------+----------------------------+-------------+
| 1 | 2014-05 | 0 |
| 2 | 2014-06 | 0 |
| 6 | 2014-07 | 0 |
| 11 | 2014-08 | 0 |
| 12 | 30 | 0 |
| 13 | __HIVE_DEFAULT_PARTITION__ | 0 |
| 14 | 10 | 0 |
| 15 | 20 | 0 |
+---------+----------------------------+-------------+
8 rows in set
拓展知识点:分区信息有没有存储在mysql中
1 | - 手动在hdfs上创建一个分区文件夹 |