Hive分区partition详解(静态分区,动态分区)

Hive分区是为了方便数据管理
Hive的分区方式:由于Hive实际是存储在HDFS上的抽象,Hive的一个分区名对应一个目录名,子分区名就是子目录名,并不是一个实际字段。
所以可以这样理解,当我们在插入数据的时候指定分区,其实就是新建一个目录或者子目录,或者在原有的目录上添加数据文件。

Hive分区的创建

Hive创建分区时,是通过PARTITIONED BY关键字进行创建,要注意的是这个关键字定义的列是表中正式的列,不能与表中其他列名重复,但是Hive下的数据文件不包含这些列,他们是目录(分区)名,目录下放的才是数据。

静态分区

单分区
  1. 创建静态分区表
    create table table1(
    id int,
    name string,
    hobby array,
    address map
    ) 
    partitioned by (part string)
    row format delimited
    fields terminated by ','
    collection items terminated by '-'
    map keys terminated by ':'
    lines terminated by '\n';
    

    创建成功
    Hive分区partition详解(静态分区,动态分区)_第1张图片
    分区字段不能与表中其他字段重复 否则会报错 ↓ ↓ ↓
    Hive分区partition详解(静态分区,动态分区)_第2张图片
    这个时候我们desc查看一下表结构
    Hive分区partition详解(静态分区,动态分区)_第3张图片

  2. 向表中装载数据

    数据如下:

    1,Tim,football-book-movie,beijing:hd-shanghai:pd
    2,Tom,book-movie-run,beijing:hd-shanghai:pd
    3,Aim,football-movie,beijing:hd-shanghai:pd
    

    执行load 装载数据(其实load操作相当于把文件移动到HDFS的Hive目录下)

    load data local inpath '/opt/aaa' overwrite into table table1 partition (part='p1');
    

    加载成功在这里插入图片描述

  3. 查看表的数据
    select * from table1;
    

    在这里插入图片描述

  4. 查看表的分区
    show partitions table1;
    

    在这里插入图片描述
    web界面
    Hive分区partition详解(静态分区,动态分区)_第4张图片
    可以看到,在新建分区表的时候,系统会在hive数据仓库默认路径/user/hive/warehouse/下创建一个目录(表名),再创建目录的子目录part=p1(分区名),最后在分区名下存放实际的数据文件(load加载进表的文件)。
    我们在加载一组数据到新的分区去
    加载数据到新的part2分区

     load data local inpath '/opt/aaa' overwrite into table table1 partition (part='part2');
    

    此时表里的数据:Hive分区partition详解(静态分区,动态分区)_第5张图片
    表的分区:
    Hive分区partition详解(静态分区,动态分区)_第6张图片
    web界面
    Hive分区partition详解(静态分区,动态分区)_第7张图片

多分区
  1. 创建多分区表
    分区逻辑大致是 部门分区下有性别分区 目录:dept/sex
     create table table2(
    id int,
    name string,
    hobby array,
    address map
    ) 
    partitioned by (dept string,sex string)
    row format delimited
    fields terminated by ','
    collection items terminated by '-'
    map keys terminated by ':'
    lines terminated by '\n';
    
    创建成功!!
    Hive分区partition详解(静态分区,动态分区)_第8张图片
  2. 加载数据到表中
    分区字段都要加,否则会报错FAILED: SemanticException [Error 10006]: Line 1:88 Partition not found ”0”
    load data local inpath '/opt/aaa' overwrite into table table2 partition (dept='TD',sex='male');
    load data local inpath '/opt/aaa' overwrite into table table2 partition (dept='TD',sex='female');
    
  3. 查询表中数据
    Hive分区partition详解(静态分区,动态分区)_第9张图片
    可以看出分区关系,前面是大分区,大分区中有两个小分区,数据在不同的小分区上
    看web界面会更明了
    在这里插入图片描述
    Hive分区partition详解(静态分区,动态分区)_第10张图片

动态分区

如果用上述的静态分区,插入的时候必须首先要知道有什么分区类型,而且每个分区写一个load data,太烦人。使用动态分区可解决以上问题,其可以根据查询得到的数据动态分配到分区里。其实动态分区与静态分区区别就是不指定分区目录,由系统自己选择。
首先,启动动态分区功能
注意,动态分区不允许主分区采用动态列而副分区采用静态列,这样将导致所有的主分区都要创建副分区静态列所定义的分区。
动态分区可以允许所有的分区列都是动态分区列,但是要设置一个参数hive.exec.dynamic.partition.mode :

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nostrick;

我们以多分区为例,单分区则更加简单
我们首先有一个表的数据 以我们的table2为例。
Hive分区partition详解(静态分区,动态分区)_第11张图片
我们重新复制一个与table2表结构一模一样的表table3 利用like关键字
Hive分区partition详解(静态分区,动态分区)_第12张图片
现在我把table2的内容直接插入到另一张表table3中, (不指定到底是那个部门和性别,让系统分配)

insert overwrite table table3 partition(dept='TD',sex)
select * from table2;

未指定分区
Hive分区partition详解(静态分区,动态分区)_第13张图片
查看表数据
Hive分区partition详解(静态分区,动态分区)_第14张图片
对照table2分区信息,完全符合 证明动态分区成功!!

表分区的增删改查

添加分区
alter table table3 add partition (dept='HR',sex='male');

在这里插入图片描述

删除分区
alter table table3 drop partition (dept='TD',sex='male');

删除相应的分区,该分区的内容也会消失
Hive分区partition详解(静态分区,动态分区)_第15张图片

查询分区
show partitions table_name;
修复分区

修复分区就是重新同步hdfs上的分区信息。

msck repair table table_name;

你可能感兴趣的:(学习小结)