• 摸鱼大数据——Hive表操作——分区表


    1、介绍

    特点: 分区表会在HDFS上产生目录。查询数据的时候使用分区字段筛选数据,可以避免全表扫描,从而提升查询效率
    注意: 如果是分区表,在查询数据的时候,如果没有使用分区字段,它回去进行全表扫描,会降低效率

    只需要记住一点,分区表是用来提升Hive的数据分析效率

    2、一级分区
    创建分区表: create [external] table [if not exists] 表名称(字段名称1 字段数据类型,字段名称2 字段数据类型..) partitioned by (分区字段 字段数据类型);
    ​
    自动生成分区目录并插入数据: load data [local] inpath '文件路径' into table 表名称 partition (分区字段=值);
    ​
    注意: 如果使用load导入数据,没有写local,文件路径就是HDFS上的路径。否则就是linux的路径

    示例:

    use day06;
    ​
    -- 1- 创建分区表
    create table one_part_tb(
        id int,
        name string,
        price double,
        num int
    ) partitioned by (year int)
    row format delimited fields terminated by ' ';
    ​
    ​
    -- 2- 通过load将HDFS中的文件导入到Hive表中
    load data inpath '/source/order202251.txt' into table one_part_tb partition (year=2022);
    load data inpath '/source/order202351.txt' into table one_part_tb partition (year=2023);
    load data inpath '/source/order202352.txt' into table one_part_tb partition (year=2023);
    load data inpath '/source/order2023415.txt' into table one_part_tb partition (year=2023);
    ​
    -- 3- 数据验证
    select * from one_part_tb;
    ​
    -- 4- 使用分区
    select * from one_part_tb where year=2022;
    ​
    -- 5- 如果没有指定分区,那么会进行全表扫描,拖慢了效率
    select * from one_part_tb where price>=20;

    3、多级分区
    创建分区表: create [external] table [if not exists] 表名称(字段名称1 字段数据类型,字段名称2 字段数据类型..) partitioned by (分区字段1 字段数据类型,分区字段2 字段数据类型...);
    ​
    自动生成分区目录并插入数据: load data [local] inpath '文件路径' into table 表名称 partition (分区字段1=值,分区字段2=值....);
    ​
    注意: 如果使用load导入数据,没有写local,文件路径就是HDFS上的路径。否则就是linux的路径

    示例:

    use day06;
    ​
    -- 1- 创建多级分区表
    create external table multi_pat_tb(
        id int,
        name string,
        price double,
        num int
    ) partitioned by (year string,month string,day string)
    row format delimited fields terminated by ' ';
    ​
    -- 2- 加载HDFS数据到Hive表中
    load data inpath '/source/order202251.txt' into table multi_pat_tb partition (year="2022",month="5",day="1");
    load data inpath '/source/order202351.txt' into table multi_pat_tb partition (year="2023",month="5",day="1");
    load data inpath '/source/order202352.txt' into table multi_pat_tb partition (year="2023",month="5",day="2");
    load data inpath '/source/order2023415.txt' into table multi_pat_tb partition (year="2023",month="4",day="15");
    ​
    -- 3- 数据验证
    select * from multi_pat_tb;
    ​
    -- 4- 使用分区
    -- 注意: 如果是多分区,使用分区来提升效率的时候,需要根据需求来决定到底使用几个分区。并不需要所有的分区都用到
    -- 需求:要对2023全年的销售情况进行分析
    select * from multi_pat_tb where year="2023";
    -- 需求:要对2023年5月整个月的销售情况进行分析
    select * from multi_pat_tb where year="2023" and month="5";
    select * from multi_pat_tb where year="2023" and month="5" and day="2";
    ​
    -- 5- 不使用分区
    select * from multi_pat_tb where price>=20;

    4、分区操作
    添加分区: alter table 分区表名 add partition (分区字段1=值,分区字段2=值..);
    ​
    删除分区: alter table 分区表名 drop partition (分区字段1=值,分区字段2=值..);
    ​
    修改分区名: alter table 分区表名 partition (分区字段1=旧分区值,分区字段2=旧分区值..) rename to partition (分区字段1=新分区值,分区字段2=新分区值..);
    ​
    查看所有分区: show partitions 分区表名;
    ​
    同步/修复分区: msck repair table 分区表名;
    ​
    注意: 如果删除内部表的分区,那么对应的HDFS分区目录也被删除了;如果删除外部表的分区,那么对应的HDFS分区目录还保留着

    示例:

    use day06;
    ​
    -- 查询表的分区信息
    show partitions one_part_tb;
    show partitions multi_pat_tb;
    ​
    -- 添加分区
    alter table one_part_tb add partition (year=2024);
    -- 如果是多级分区,那么添加分区的时候,需要将所有的分区都添加上
    alter table multi_pat_tb add partition (year="2024");
    alter table multi_pat_tb add partition (year="2024",month="1",day="1");
    ​
    -- 修改分区
    alter table one_part_tb partition (year=2024) rename to partition (year=2000024);
    ​
    -- 删除分区
    -- 注意:如果删除内部表的分区,那么对应的分区目录也被删除了;如果删除外部表的分区,那么对应的HDFS分区目录还保留着
    alter table one_part_tb drop partition (year=2000024);
    alter table multi_pat_tb drop partition (year="2024",month="1",day="1");
    ​
    -- 修复分区
    -- 在执行下面的语句之前,需要手动去/user/hive/warehouse/day06.db/one_part_tb路径下创建一个year=2025分区目录
    msck repair table one_part_tb;

    给多级分区表添加分区遇到的错误:

    原因: 如果是多级分区,那么添加分区的时候,需要将所有的分区都添加上

    修改分区效果:

  • 相关阅读:
    Mybatis-plus修改指定字段
    P1972 [SDOI2009] HH的项链
    令人困惑的 Go time.AddDate
    ubuntu18安装coova chilli精简
    WebGL 选中一个表面
    JAVA番剧资讯检索系统计算机毕业设计Mybatis+系统+数据库+调试部署
    MySQL系列1:MySQL体系架构
    数据结构--》连接世界的无限可能—— 图
    【Java SE】抽象类和接口
    华为数通——Vlan
  • 原文地址:https://blog.csdn.net/weixin_65694308/article/details/139147081