Hive动态分区与静态分区讲解与示例演示

一、理论基础

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)


​

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二百四十九先森

你的打赏是我努力的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值