前言
为什么需要创建分区表?我这里有一张user表,里面记录了用户的职业、年龄、职业编号的信息,当没有条件查询时,速度如下:
大概2秒就可以查询完成,但是添加条件查询后,速度如下:
可以看到,差不多需要1分钟才能得出结果,这严重影响效率,因为已经要使用MapReduce来进行计算,用explain来看下:
select * from user
select * from user where occupationid = 0
为了提高效率,创建分区表就很有必要。
动态创建HIVE分区表
0: jdbc:hive2://dn2:10000> create table p_user(id int, gender string, age int, zip string)
. . . . . . . . . . . . .> partitioned by (occupationid int);
p_user为分区表明,partitioned by 则是根据什么字段来进行分区,我这里是occupationid。
创建成功后,就需要将数据导入分区表:
0: jdbc:hive2://dn2:10000> insert overwrite table p_user partition(occupationid) select id,gender,age,zip,occupationid from user;
当导入完成后,可以到hdfs上面看看p_user中是怎么存储数据的:
很明显,每个不同的occupationid都会单独存放在一个文件夹中,这样当以occupationid为查询条件时就只需要在某个occupationid中查找,测试下速度:
1点几秒就可以完成,速度效率提升非常大,顺便explain一下:
并没有开启Mapduce的作业。
静态分区表创建
静态分区表和动态差不多一样,只不过在导入数据需要加上条件,如下:
0: jdbc:hive2://dn2:10000> insert overwrite table p_user partition(occupationid=22) select id,gender,age,zip,occupationid from user
静态和动态最大的区别是动态能根据occupationid的不同而创建不同的分区表,而静态则是指定创建occupationid某个值的分区,上面是occupation=22。
结尾
分区表的使用能够提供我们的条件查询效率,但是并不是什么字段都能作为分区表的依据,像身份证号码这种有上亿个不同值是不能作为分区依据的。
错误
若出现以下错误:
Permission denied: user=anonymous, access=WRITE, inode="/user/anonymous":hdfs:supergroup:drwxr-xr-x
只需要输入
hadoop dfs -chmod -R 777 /user/anonymous
即可解决