一、理论基础
1、分区对比:
就oracle而言,分区是真实字段,在数据进行插入的时候自动分配分区。
Hive的一个分区对应一个目录,子分区就是子目录,并不是一个真实字段,但查询能看到分区字段。
2、Hive的分区分为静态分区和动态分区。
分区字段可用于where子句过滤
静态分区,插入必须知道分区字段的值,load data逐个load,太烦人。
查询数据动态分配到分区里。其实动态分区与静态分区别就是不指定分区字段的值,由系统自己选择。
二、静态分区
1、创建静态分表区
create table par_tab (name string,nation string) partitioned by (sex string)
row format delimited fields terminated by ',';
#####分区字段不存在于真实字段中
2、查看表结构
hive> desc par_tab;
OK
name string
nation string
sex string #####能看到分区字段
# Partition Information
# col_name data_type comment
sex string
Time taken: 0.038 seconds, Fetched: 8 row(s)
3、插入数据
数据文件:
jan,china
mary,america
lilei,china
heyong,china
yiku,japan
emoji,japan
插入数据:
load data local inpath '/root/files/par_tab.txt' into table par_tab
partition (sex='man');
#####分区字段为sex,分区值为man
4、查询表
hive> select * from par_tab;
OK
jan china man
mary america man
lilei china man
heyong china man
yiku japan man
emoji japan man
Time taken: 0.076 seconds, Fetched: 6 row(s)
注意:
表中字段变成了3列,包含分区列
5、查看hdfs目录结构
[hadoop@hadoop001 files]$ hadoop dfs -lsr /user/hive/warehouse/par_tab
drwxr-xr-x - hadoop supergroup 0 2017-03-29 08:25 /user/hive/warehouse/par_tab/sex=man
-rwxr-xr-x 1 hadoop supergroup 71 2017-03-29 08:25 /user/hive/warehouse/par_tab/sex=man/par_tab.txt
6、创建多级分区
create table par_tab_muilt (name string, nation string)
partitioned by (sex string,dt string)
row format delimited fields terminated by ',' ; #####创建
load data local inpath '/root/files/par_tab.txt' into table par_tab_muilt
partition (sex='man',dt='2017-03-29'); #####添加数据
[hadoop@hadoop001 files]$hadoop dfs -lsr /user/hive/warehouse/par_tab_muilt
drwxr-xr-x - hadoop supergroup 0 2017-03-29 08:45 /user/hive/warehouse/par_tab_muilt/sex=man
drwxr-xr-x - hadoop supergroup 0 2017-03-29 08:45 /user/hive/warehouse/par_tab_muilt/sex=man/dt=2017-03-29
-rwxr-xr-x 1 hadoop supergroup 71 2017-03-29 08:45 /user/hive/warehouse/par_tab_muilt/sex=man/dt=2017-03-29/par_tab.txt
#####查看目录结构,分区时分区前后关系决定了分区目录的父子关系
三、动态分区
1、启用动态分区功能
hive> set hive.exec.dynamic.partition=true;
#####hive2.x该参数默认为true,1.x为false
2、创建动态分区表
create table par_dnm (name string,nation string) partitioned by
(sex string,dt timestamp)
row format delimited fields terminated by ',';
#####和创建静态分区表一模一样
3、导入数据:
hive> insert overwrite table par_dnm partition(sex='man',dt)
> select name, nation, sex,dt from nor_tab;
#####sex为静态分区,dt动态分区
#####nor_tab为普通表,必须包含动态分区表中的普通列和分区列。
####select子句的字段顺序必须要和动态分区表的建表字段顺序一致,表中字段完了才出现分区字段
#####在select最后一个字段必须是你的动态分区字段,这样就会自行根据dt的value来分区。
4、查看hdfs表结构
drwxr-xr-x - hadoop supergroup 0 2017-03-29 10:32 /user/hive/warehouse/par_dnm/sex=man
drwxr-xr-x - hadoop supergroup 0 2017-03-29 10:32 /user/hive/warehouse/par_dnm/sex=man/dt=2013-03-28
-rwxr-xr-x 1 hadoop supergroup 41 2017-03-29 10:32 /user/hive/warehouse/par_dnm/sex=man/dt=2013-03-28/000000_0
drwxr-xr-x - hadoop supergroup 0 2017-03-29 10:32 /user/hive/warehouse/par_dnm/sex=man/dt=2013-03-29
-rwxr-xr-x 1 hadoop supergroup 71 2017-03-29 10:32 /user/hive/warehouse/par_dnm/sex=man/dt=2013-03-29/000000_0
5、查看分区数
hive> show partitions par_dnm;
OK
sex=man/dt=2013-03-28
sex=man/dt=2013-03-29
Time taken: 0.065 seconds, Fetched: 2 row(s)
#####分区成功
6、注意
动态分区不允许主分区采用动态列而副分区采用静态列。
动态分区可以允许所有的分区列都是动态分区列,但要设置参数:
hive.exec.dynamic.partition.mode=nostrick;
它的默认值是strick,即不允许分区列全部是动态的。
7、相关参数
hive.exec.dynamic.partition
是否允许动态分区,默认为true,允许
hive.exec.dynamic.partition.mode=nostrick;
它的默认值是strick,即不允许分区列全部是动态的。
set hive.exec.max.dynamic.partitions.pernode;
每一个执行mr节点上,允许创建的动态分区的最大数量(100)
set hive.exec.max.dynamic.partitions;
所有执行mr节点上,允许创建的所有动态分区的最大数量(1000)
set hive.exec.max.created.files;
所有的mr job允许创建的文件的最大数量(100000)