• hive从入门到放弃(四)——分区与分桶


    今天讲讲分区表和分桶表,前面的文章还没看的可以点击链接:
    hive从入门到放弃(一)——初识hive
    hive从入门到放弃(二)——DDL数据定义
    hive从入门到放弃(三)——DML数据操作

    分区

    分区可以提高查询效率,实际上 hive 的一个分区就是 HDFS 上的一个目录,目录里放着属于该分区的数据文件。

    分区的基本操作

    创建分区表

    create table partition_table(
    	col1 int, 
    	col2 string
    )
    partitioned by (part_col string)
    row format delimited fields terminated by '\t';
    

    *分区字段不能是表中字段

    创建完分区表如果需要将数据导入表中,需要用 load 命令导入;

     load data local inpath 
    '/data_dir/data_file' into table partition_table 
    partition(part_col='20220331');
    

    如果是在 HDFS 中创建目录并将数据文件传到目录中,是没办法查到的,因为查询分区表是需要查询元数据的;

    如果非要用这种方法或者已经做了,可以执行修复命令: msck repair table table_name;

    查看分区

    show partitions partition_table;
    

    查询

    select * from partition_table where part_col='20220331';
    

    添加分区

    alter table partition_table add partition(part_col='20220331');
    

    删除分区

    alter table partition_table drop partition(part_col='20220331');
    

    二级分区

    二级分区相当于在一级分区对应的目录上新增一个目录,一般用于单个分区数据量很大,需要做拆解的情况。

    创建二级分区表

    create table partition_table(
    	col1 int, 
    	col2 string
    )
    partitioned by (part_col1 string, part_col2 string)
    row format delimited fields terminated by '\t';
    

    二级分区表的其它操作与一级的区别不大,因此不做过多的描写。

    动态分区

    关系型数据库中,对分区表 Insert 数据时候,数据库自动会根据分区字段的值,将数据插入到相应的分区中

    Hive 中也提供了类似的机制,即动态分区(Dynamic Partition),不过使用 Hive 的动态分区需要进行相应的配置。

    开启动态分区功能(默认 true,开启)

    hive.exec.dynamic.partition=true
    

    设置为非严格模式

    hive.exec.dynamic.partition.mode=nonstrict
    

    默认 strict,表示至少指定一个分区为静态分区,nonstrict 表示允许所有的分区字段都能使用动态分区。

    所有执行 MR 的节点上,最大一共可以创建多少个动态分区。默认 1000

    hive.exec.max.dynamic.partitions=1000
    

    每个执行 MR 的节点上,最大可以创建多少个动态分区。比如源数据中包含了一年的数据,即 day 字段有 365 个值,那么该参数就
    需要设置成大于 365,如果使用默认值 100,则会报错。

    hive.exec.max.dynamic.partitions.pernode=100
    

    动态插入数据到分区

    insert into partition_table partition(part_col) select * from table_name;
    

    分桶

    分区提高了数据的查询效率,同时还能将数据隔离开,但是并非所有数据能形成合理的分区。

    hive可以将数据进行分桶,不同于分区是针对存储路径进行分类,分桶是在数据文件中对数据进行划分的一种技术。

    分桶是指定某一列,让该列数据按照哈希取模的方式随机、均匀的分发到各个桶文件中。

    创建分桶表

    -- 分 6 个桶的分桶表
    create table bucket_table(col1 int, col2 string)
    clustered by(col1) 
    into 6 buckets
    row format delimited fields terminated by '\t';
    

    加载数据

    加载数据到分桶表中可以使用 load 或者 insert 的方式。

    需要注意的是,reduce 的个数设置应该为-1,让 Job 自行决定需要用多少个 reduce 或者将 reduce 的个
    数设置为大于等于分桶表的桶数。

    抽样

    对于非常大的数据集,有时用户需要使用的是一个具有代表性的查询结果而不是全部结
    果。Hive 可以通过对表进行抽样来满足这个需求。

    语法:tablesample(bucket x out of y)

    select * from bucket_table tablesample(bucket 1 out of 3 on col1);
    

    y必须是table总共bucket数的倍数或者因子。

    上面的语句表示:对于分桶数为 6 的表,总共抽取 6/y = 6/3 = 2 个bucket的数据,

    分别为第 x=1 个 bucket 和第 x+3=4 个 bucket 的数据。

    小结

    本文简单介绍了 hive 的分区,包括如何创建分区表、新建分区和删除分区,还有二级分区和动态分区;以及分桶表,包括分桶表的概念和抽样函数。

    持续关注不迷路,转载请注明出处! —— 大数据的奇妙冒险

  • 相关阅读:
    一种车载监控数据存储方法
    【EI会议征稿】第三届信号处理与通信技术国际学术会议(SPCT 2023)
    串口转以太网与监控软件modbusTCP客户端通信配置
    强化学习——PyTorch 实现 Advantage Actor-Critic (A2C)
    请问哪家淘宝/天猫店 您家的是真的 STM32F103C8T6系统板?
    正则表达式
    CICD 流程学习(四)搜素服务与消息队列
    分清楚各式各样的USB接口!一帖搞定
    如何选择外贸网站服务器?
    进博会期间,多地政府领导密集考察深兰科技
  • 原文地址:https://www.cnblogs.com/lyuzt/p/16091617.html