大数据Hive--分区表和分桶表

打印 上一主题 下一主题

主题 942|帖子 942|积分 2826

一、分区表

1.1 分区表

Hive中的分区就是把一张大表的数据按照业务需要分散的存储到多个目次,每个目次就称为该表的一个分区。在查询时通过where子句中的表达式选择查询所需要的分区,如许的查询效率会进步很多。
1.1.1 分区表根本语法

1.1.1.1 创建分区表

  1. create table dept_partition
  2. (
  3.     deptno int,    --部门编号
  4.     dname  string, --部门名称
  5.     loc    string  --部门位置
  6. )
  7.     partitioned by (day string)
  8.     row format delimited fields terminated by '\t';
复制代码
1.1.1.2 分区表读写数据

1)写数据
load
在/opt/module/hive/datas/路径上创建文件dept_20220401.log,并输入如下内容
  1. [yudan@hadoop102 datas]$ vim dept_20220401.log
  2. 10        行政部        1700
  3. 20        财务部        1800
复制代码
  1. load data local inpath '/opt/module/hive/datas/dept_20220401.log'
  2. into table dept_partition
  3. partition(day='20220401');
复制代码
insert
将day='20220401’分区的数据插入到day='20220402’分区,可实行如下装载语句
  1. insert overwrite table dept_partition partition (day = '20220402')
  2. select deptno, dname, loc
  3. from dept_partition
  4. where day = '2020-04-01'
复制代码
2)读数据
查询分区表数据时,可以将分区字段看作表的伪列,可像使用其他字段一样使用分区字段。
  1. select deptno, dname, loc ,day
  2. from dept_partition
  3. where day = '2020-04-01';
复制代码
1.1.1.3 分区表根本操作

1)查看所有分区信息
  1. show partitions dept_partition;
复制代码
2)增加分区
(1)创建单个分区
  1. alter table dept_partition
  2. add partition(day='20220403');
复制代码
(2)同时创建多个分区(分区之间不能有逗号)
  1. alter table dept_partition
  2. add partition(day='20220404') partition(day='20220405');
复制代码
3)删除分区
(1)删除单个分区
  1. alter table dept_partition
  2. drop partition (day='20220403');
复制代码
(2)同时删除多个分区(分区之间必须有逗号)
  1. alter table dept_partition
  2. drop partition (day='20220404'), partition(day='20220405');
复制代码
4)修复分区
Hive将分区表的所有分区信息都保存在了元数据中,只有元数据与HDFS上的分区路径一致时,分区表才气正常读写数据。若用户手动创建/删除分区路径,Hive都是感知不到的,如许就会导致Hive的元数据和HDFS的分区路径不一致。再比如,若分区表为外部表,用户实行drop partition下令后,分区元数据会被删除,而HDFS的分区路径不会被删除,同样会导致Hive的元数据和HDFS的分区路径不一致。
若出现元数据和HDFS路径不一致的情况,可通过如下几种本事举行修复。
(1)add partition
若手动创建HDFS的分区路径,Hive无法识别,可通过add partition下令增加分区元数据信息,从而使元数据和分区路径保持一致。
(2)drop partition
若手动删除HDFS的分区路径,Hive无法识别,可通过drop partition下令删除分区元数据信息,从而使元数据和分区路径保持一致。
(3)msck
若分区元数据和HDFS的分区路径不一致,还可使用msck下令举行修复,以下是该下令的用法阐明。
  1. msck repair table table_name [add/drop/sync partitions];
复制代码


  • 阐明:

    • msck repair table table_name add partitions:该下令会增加HDFS路径存在但元数据缺失的分区信息。
    • msck repair table table_name drop partitions:该下令会删除HDFS路径已经删除但元数据仍然存在的分区信息。
    • msck repair table table_name sync partitions:该下令会同步HDFS路径和元数据分区信息,相称于同时实行上述的两个下令。
    • msck repair table table_name:等价于msck repair table table_name add partitions下令。

1.2 二级分区表

如果一天内的日志数据量也很大,怎样再将数据拆分?答案是二级分区表,例如可以在按天分区的底子上,再对天天的数据按小时举行分区。
1)二级分区表建表语句
  1. create table dept_partition2(
  2.     deptno int,    -- 部门编号
  3.     dname string, -- 部门名称
  4.     loc string     -- 部门位置
  5. )
  6. partitioned by (day string, hour string)
  7. row format delimited fields terminated by '\t';
复制代码
2)数据装载语句
  1. load data local inpath '/opt/module/hive/datas/dept_20220401.log'
  2. into table dept_partition2
  3. partition(day='20220401', hour='12');
复制代码
3)查询分区数据
  1. select
  2.     *
  3. from dept_partition2
  4. where day='20220401' and hour='12';
复制代码
1.3 动态分区

动态分区是指向分区表insert数据时,被写往的分区不由用户指定,而是由每行数据的最后一个字段的值来动态的决定。使用动态分区,可只用一个insert语句将数据写入多个分区。
1)动态分区相关参数
(1)动态分区功能总开关(默认true,开启)
  1. set hive.exec.dynamic.partition=true
复制代码
(2)严格模式和非严格模式
动态分区的模式,默认strict(严格模式),要求必须指定至少一个分区为静态分区,nonstrict(非严格模式)允许所有的分区字段都使用动态分区。
  1. set hive.exec.dynamic.partition.mode=nonstrict
复制代码
(3)一条insert语句可同时创建的最大的分区个数,默认为1000。
  1. set hive.exec.max.dynamic.partitions=1000
复制代码
(4)单个Mapper或者Reducer可同时创建的最大的分区个数,默认为100。
  1. set hive.exec.max.dynamic.partitions.pernode=100
复制代码
(5)一条insert语句可以创建的最大的文件个数,默认100000。
  1. hive.exec.max.created.files=100000
复制代码
(6)当查询结果为空时且举行动态分区时,是否抛出异常,默认false。
  1. hive.error.on.empty.partition=false
复制代码
2)案例实操
需求:将dept表中的数据按照地区(loc字段),插入到目标表dept_partition_dynamic的相应分区中。
(1)创建目标分区表
  1. create table dept_partition_dynamic(
  2.     id int,
  3.     name string
  4. )
  5. partitioned by (loc int)
  6. row format delimited fields terminated by '\t';
复制代码
(2)设置动态分区
  1. set hive.exec.dynamic.partition.mode = nonstrict;
  2. insert into table dept_partition_dynamic
  3. partition(loc)
  4. select
  5.     deptno,
  6.     dname,
  7.     loc
  8. from dept;
复制代码
(3)查看目标分区表的分区情况
  1. show partitions dept_partition_dynamic;
复制代码
二、分桶表

分区提供一个隔离数据和优化查询的便利方式。不过,并非所有的数据集都可形成合理的分区。对于一张表或者分区,Hive 可以进一步构造成桶,也就是更为细粒度的数据范围划分,分区针对的是数据的存储路径,分桶针对的是数据文件。
分桶表的根本原理是,起首为每行数据盘算一个指定字段的数据的hash值,然后模以一个指定的分桶数,最后将取模运算结果雷同的行,写入同一个文件中,这个文件就称为一个分桶(bucket)。
2.1 分桶表根本语法

1)建表语句
  1. create table stu_buck(
  2.     id int,
  3.     name string
  4. )
  5. clustered by(id)
  6. into 4 buckets
  7. row format delimited fields terminated by '\t';
复制代码
2)数据装载
(1)数据预备
在/opt/module/hive/datas/路径上创建student.txt文件,并输入如下内容。
  1. 1001        student1
  2. 1002        student2
  3. 1003        student3
  4. 1004        student4
  5. 1005        student5
  6. 1006        student6
  7. 1007        student7
  8. 1008        student8
  9. 1009        student9
  10. 1010        student10
  11. 1011        student11
  12. 1012        student12
  13. 1013        student13
  14. 1014        student14
  15. 1015        student15
  16. 1016        student16
复制代码
(2)导入数据到分桶表中
阐明:Hive新版本load数据可以直接跑MapReduce,老版的Hive需要将数据传到一张表里,再通过查询的方式导入到分桶表内里。
  1. load data local inpath '/opt/module/hive/datas/student.txt'
  2. into table stu_buck;
复制代码
(3)查看创建的分桶表中是否分成4个桶
(4)观察每个分桶中的数据
2.2 分桶排序表

1)建表语句
  1. create table stu_buck_sort(
  2.     id int,
  3.     name string
  4. )
  5. clustered by(id) sorted by(id)
  6. into 4 buckets
  7. row format delimited fields terminated by '\t';
复制代码
2)数据装载
(1)导入数据到分桶表中
  1. load data local inpath '/opt/module/hive/datas/student.txt'
  2. into table stu_buck_sort;
复制代码
(2)查看创建的分桶表中是否分成4个桶
(3)观察每个分桶中的数据

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

傲渊山岳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表