在Hive中处理数据时,当处理的一张表的数据量过大的时候,每次查询都是遍历整张表,显然对于计算机来说,是负担比较重的。所以我们可不可以针对数据进行分类,查询时只遍历该分类中的数据,这样就能有效的解决问题。所以就会Hive在表的架构下,就会有分区的这个概念,就是为了满足此需求。
分区表的一个分区对应hdfs上的一个目录
分区表包括静态分区表和动态分区表,根据分区会不会自动创建来区分
多级分区表,即创建的时候指定 PARTITIONED BY (event_month string,loc string),根据顺序,级联创建 event_month=XXX/loc=XXX目录,其他和一级的分区表是一样的
1.静态分区
创建分区表
hive (default)> create table order_partiton(
> order_no string,
> order_time string
> )
> PARTITIONED BY (event_month string)
> row format delimited fields terminated by '\t';
OK
Time taken: 0.052 seconds
加载数据到HIVE表
hive (default)> load data local inpath '/home/hadoop/order_created.txt' into table order_partiton PARTITION (event_month='2014-05');
Loading data to table default.order_partiton partition (event_month=2014-05)
Partition default.order_partiton{event_month=2014-05} stats: [numFiles=1, numRows=0, totalSize=213, rawDataSize=0]
OK
Time taken: 0.347 seconds
根据分区查找数据
hive (default)> select * from order_partiton where event_month='2014-05';
OK
order_partiton.order_no order_partiton.order_time order_partiton.event_month
10703007267488 2014-05-01 06:01:12.334+01 2014-05
10101043505096 2014-05-01 07:28:12.342+01 2014-05
10103043509747 2014-05-01 07:50:12.33+01 2014-05
10103043501575 2014-05-01 09:27:12.33+01 2014-05
10104043514061 2014-05-01 09:03:12.324+01 2014-05
Time taken: 0.163 seconds, Fetched: 5 row(s)
真正的表的字段是不包含分区字段的,分区字段只是HDFS上的文件夹的名称
在生产上,一般:数据经过清洗后存放在HDFS目录上,然后将目录的数据加载到分区表中
一般都会导致元数据缺失,需要修复相应的表,或者另外的命令:ALTER TABLE table_name ADD IF NOT EXISTS
PARTITION (event_month='xxx') ;
hive (default)> msck repair table 表名;
创建多级分区
hive (default)> create table order_mulit_partiton(
> order_no string,
> order_time string
> )
> PARTITIONED BY (event_month string, step string)
> row format delimited fields terminated by '\t';
OK
Time taken: 0.074 seconds
hive (default)> desc formatted or