Hive分区和分桶的区别
1.前言
Hive的分区和分桶都是细化数据管理,加快数据查询和分析,两者有什么区别呢?下面讲解一下分区和分桶的原理。
2.分区
(1)分区原理
Hive的分区表可以有一个或多个分区键,用于确定数据的存储方式。分区(除了作为存储单元)还允许用户有效地识别满足指定条件的数据,显著加快查询分析速度。分区字段并不是数据的一部分,而是加载时虚拟的列,数据在HDFS上存储时分区就相当于文件目录。
Hive的分区使用HDFS的子目录功能实现。每一个子目录包含了分区对应的列名和每一列的值
Hive的分区方式:由于Hive实际是存储在HDFS上的抽象,Hive的一个分区名对应一个目录名,子分区名就是子目录名,并不是一个实际字段。
(2)分区建表
分区表使用partitioned by 子句指定,以指定字段列,需要指定字段类型。
--分区表建表sql
USE testdb;
CREATE TABLE test_partition (
field1 String Comment 'field1 comment',
field2 String Comment 'field2 comment'
)
Comment 'table comment'
PARTITIONED BY(d String Comment 'date')
STORED AS ORC; --分区表查询
SELECT *
FROM testdb.test_partition
WHERE d = '2022-02-01';
建表完成后查看LOCATION参数为:'
hdfs://ns/user/hive/warehouse/testdb.db/test_partition'。当存储数据时,2022-02-01日期的数存储在hdfs://ns/user/hive/warehouse/testdb.db/test_partition/d=2022-02-01目录下。
如果指定多个分区列用逗号分隔开,如:建表是PARTITIONED BY(d String Comment 'date',h String Comment 'hour'),分区字段日期常用格式:d=yyyy-MM-dd,h=HH。第二个参数会作为子目录存储在HDFS上:***/test_partition/d=2022-02-01/h=12
3.分桶
(1)分桶原理
分桶表是在表或者分区表的基础上,进一步对表进行组织,分桶表的数据可以根据表中某列的哈希函数的值依次划分为存储桶,用于分桶的字段是数据中实际的一列。其原理:根据分桶的列计算hash值,对hash值取模运算,将数据放到对应的桶里。保证了每个桶中都有数据,但每个桶中的数据条数不一定相等。
如要按照name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件。
(2)分桶建表
分桶表由clustered by 子句指定,指定字段为真实字段,需要指定桶的个数,桶编号从零开始。
--分桶表建表sql,创建4个桶
USE testdb;
CREATE TABLE test_bucket (
field1 String Comment 'field1 comment',
field2 String Comment 'field2 comment'
)
COMMENT 'table comment'
clustered by (field1) into 4 buckets
row format delimited
fields terminated by ','; --分桶表查询
SELECT *
FROM testdb.test_bucket
WHERE field1 = '0'
4.相同点和不同点
(1)相同点
分区和分桶表都是Hive细化数据管理,加快数据查询和分析。
(2)不同点
① 表现形式:
分区表是一个目录,分桶表是文件。
分桶随机分割数据库,分区是非随机分割数据库。因为分桶是按照列的哈希函数进行分割的,相对比较平均;而分区是按照列的值来进行分割的,容易造成数据倾斜。
② 创建语句:
分区表使用partitioned by 子句指定,以指定字段为伪列,需要指定字段类型。
分桶表由clustered by 子句指定,指定字段为真实字段,需要指定桶的个数。
③ 数量:
分区表的分区个数可以增长,分桶表一旦指定,不能再增长。
④ 作用:
分区避免全表扫描,根据分区列查询指定目录提高查询速度。
分桶保存分桶查询结果的分桶结构(数据已经按照分桶字段进行了hash散列)。
分桶表数据进行抽样和JOIN时可以提高MR程序效率。
Hive分区和分桶的区别的更多相关文章
- hive -- 分区,分桶(创建,修改,删除)
hive -- 分区,分桶(创建,修改,删除) 分区: 静态创建分区: 1. 数据: john doe 10000.0 mary smith 8000.0 todd jones 7000.0 boss ...
- HIVE—索引、分区和分桶的区别
一.索引 简介 Hive支持索引,但是Hive的索引与关系型数据库中的索引并不相同,比如,Hive不支持主键或者外键. Hive索引可以建立在表中的某些列上,以提升一些操作的效率,例如减少MapRed ...
- Hive分区表与分桶
分区表 在Hive Select查询中.通常会扫描整个表内容,会消耗非常多时间做不是必需的工作. 分区表指的是在创建表时,指定partition的分区空间. 分区语法 create table tab ...
- Hive动态分区和分桶(八)
Hive动态分区和分桶 1.Hive动态分区 1.hive的动态分区介绍 hive的静态分区需要用户在插入数据的时候必须手动指定hive的分区字段值,但是这样的话会导致用户的操作复杂度提高,而且在 ...
- Hive为什么要分桶
对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分.Hive也是针对某一列进行桶的组织.Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记 ...
- hive 分区表和分桶表
1.创建分区表 hive> create table weather_list(year int,data int) partitioned by (createtime string,area ...
- Hive学习笔记——Hive中的分桶
对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分.Hive也是针对某一列进行桶的组织.Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记 ...
- Hive 学习之路(五)—— Hive 分区表和分桶表
一.分区表 1.1 概念 Hive中的表对应为HDFS上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为HDFS上表目录的子目录,数据按照分区存储在子目录中.如 ...
- Hive 系列(五)—— Hive 分区表和分桶表
一.分区表 1.1 概念 Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为 HDFS 上表目录的子目录,数据按照分区存储在子 ...
- 入门大数据---Hive分区表和分桶表
一.分区表 1.1 概念 Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为 HDFS 上表目录的子目录,数据按照分区存储在子 ...
随机推荐
- d3过滤
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...
- @Conditional注解使用及@ConditionalOnXXX各注解的作用
本文为博主原创,转载请注明 出处: 一.@Conditional注解作用: 必须是 @Conditional 注解指定的条件成立,才会在容器中添加组件,配置类里面的所有配置才会生效 二.@Condit ...
- 在线photoshop网页版工具开发
基于javascript开发的在线ps工具,打包方式webpack 在线预览 在线ps网页版 源码地址 https://github.com/geeeeeeeek 功能介绍 在线图像编辑器允许您使用H ...
- [springmvc] - 配置文件 springmvc-config.xml 和 web.xml
springmvc-config.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmln ...
- [转帖]Linux 性能监控 Sar (Sysstat) 示例
https://bbs.huaweicloud.com/blogs/345343# [摘要] 使用 sar,您可以实时监控各种 Linux 子系统(CPU.内存.I/O..)的性能,还可以持续收集 ...
- [转帖]比较不同CPU下的分支预测
https://plantegg.github.io/2023/04/16/%E6%AF%94%E8%BE%83%E4%B8%8D%E5%90%8CCPU%E4%B8%8B%E7%9A%84%E5%8 ...
- [转帖]jar启动指定JDK/JRE 安装路径教程
https://blog.csdn.net/weixin_40986713/article/details/128136777 前言 因为疫情在家办公的缘故,有个老项目,需要改个接口,然后需要前端联调 ...
- node中的优先从缓存中加载模块与模块的加载规则
执行 node main.js 请问 b模块会被加载几次 //main.js require('./a.js') var fn = require('./b.js') console.log(fn.s ...
- vue3中markRaw的使用
markRaw 作用:将一个对象标记为不可以被转化为代理对象.返回该对象本身. 应用场景: 1.有些值不应被设置成响应式时,例如复杂的第三方类库等 2.当渲染具有不可变数据源的大列表时,跳过响应式转换 ...
- vue3.2中setup语法糖父组件如何调用子组件中的方法
父组件如何调用子组件中的方法 父组件.vue <template> <div> <aa ref="testRef"></aa> &l ...