HiveSQL中的分区与分桶

这篇具有很好参考价值的文章主要介绍了HiveSQL中的分区与分桶。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 1.分区

 1.1为什么要分区?


 举例:
 如果我们有一个一年级的学生表,这个年级有10个班,那需要查看一班的学生信息,又或者是二班等等,我们的SQL语句为
 select * from student where class = '一班';
 这种方式可以查询出一班的学生,但我们的查询语句底层会转mr任务,这样会进行一个全表的查询,查询效率比较低.
 那有什么办法可以避免全表查询呢?
 如果我们能把学生表信息按照每个班级分开,分成多个文件夹,那在查询的时候就只需要检索每一个文件夹,这样就能大大提高我们查询效率了
 例如我们第一个文件夹t_class = 1 班,这个文件夹里的数据都是一班的数据(注:这里的t_class是我们的分区字段,与上文的class不一样,因为class是
 表中字段,而我们的分区字段必须是表中没有的字段,不理解的朋友可以去看看我的上一篇博客).
 所有我们就引入了分区
 分区的作用就是避免我们写HIVESQL时进行全表扫描,减少扫描次数,提高查询效率.

1.2分区表-静态分区


1.2.1创建分区表格式

create table 表名(
    列名1 类型 comment '字段说明',
    列名2 类型 comment '字段说明',
    ......,
    ......
 )comment '表说明'
 partitioned by(分区字段 类型 comment '字段说明')  --细节:分区字段必须是表中没有的字段.
 ......;


 需要注意的是我们表的字段个数为:表中字段数+分区字段

1.2.2分区表中添加数据


 格式:

​​​​​​​load data local inpath '文件位置(指的是Linux中文件位置)' into table 分区表名 partition(分区字段='xxx');

 1.2.3查询语句
 

 分区前:select * from student from class = '一班'   --对全表进行扫描
 分区后:select * from student from class = '一班'   --依旧是对全表进行扫描
       select * from student from t_class = '1班'    --精准扫描分区,避免了全表扫描

 1.3分区表-动态分区


 1.3.1建表

格式同上

 1.3.2动态分区由来

我们可以用静态分区就可以直接实现分区了,为什么还有动态分区呢?
 试想一下,如果我们手动指定分区字段和值,分区比较多的时候,我们就会写很多,不仅效率比较慢,而且可能其中会写错的可能,所有我们就有了动态分区.

 1.3.3动态分区:


 即手动指定分区格式即可,该值一样的数据,就会被自动分到一个区

 1.3.4添加数据格式:

 insert into table 分区表名 partition(分区字段名)
 select *, 新建列名 from 数据总表名;

解释: 因为我们动态分区不支持load语法,所有这里用insert into ; 为什么这里是新建列名,在说静态分区的时候我们说过,分区表的字段个数为:表中字段数+分区字段
 而我们的数据总表没有分区字段,所有我们这里需要自己添加一个列名,作为存放分区的数据,表明是用什么来分区的(例如1班,2班......)

 1.3.5严格模式

注意:我们在进行动态分区前需要手动关闭严格模式

 set hive.exec.dynamic.partition.mode=nonstrict;     -- nonstrict 非严格模式, strict: 严格模式(默认)

 1.4分区相关操作

 1.4.1添加分区

 alter table 分区表名 add partition(分区字段 = '具体按照什么划分');


在我们对大量数据处理时,我们可能经常会对时间进行分区 分区字段就可以写year(年),month(月)......等等,这里的具体按照什么划分就是指的是2020
 比如 year = 2020等等

 1.4.2添加多个分区

 alter table 分区表名 add partition(分区字段 = '具体按照什么划分') partition(分区字段 = '具体按照什么划分') partition(分区字段 = '具体按照什么划分')......;

 1.4.3修改分区

 alter table products partition(分区字段 = '具体按照什么划分') rename to partition(分区字段 = '具体按照什么划分');

 1.4.4删除分区

 alter table products drop partition(分区字段 = '具体按照什么划分');

2.分桶

 2.1为什么要分桶?


 简单来说就是对于我们在处理大文件时,可能会让系统崩溃而无法实现我们的需求,我们这时候就可以采用分桶.
 如果两个表join的时候,两个表都是分桶表的话,我们就不需要再去扫描整个表,只需要按照对应的桶进行匹配,从而提升效率.

 2.2分桶的原理


 分桶就是将我们的数据按照分桶字段拆分成N个小文件(注意:分区是分成文件夹).

 2.3分桶的规则


 哈希取模分桶法:根据分桶字段计算它的哈希值, 然后和桶的个数取余, 余数为几, 就进哪个桶.

 2.4分桶表创建格式

 create table 表名(
    列名1 类型 comment '字段说明',
    列名2 类型 comment '字段说明',
    ......,
    ......
 )comment '表说明'
 clustered by (分桶字段) sorted by (排序字段) into N buckets;   --细节:分桶字段必须是表中已经有的字段.


 注意:这里的 clustered by 是用来分桶的,分桶字段后面没有写类型,因为分桶字段必须是表中已经有的字段,类型我们已经定义过了
 sorted by 是用来排序的,这个可以省略,相当于我们可以直接写成 clustered by (分桶字段) into N buckets.

 2.5添加数据格式

 insert into 分桶表名 select * from 原数据表名;

3.建表图解

HiveSQL中的分区与分桶,数据库,java,sql

中括号代表可以省略

 4.总结

分区与分桶不同点:1.分区是分文件夹,而分桶是分文件 2.分区是避免全表扫描,分桶是方便数据采集,减少join次数
 相同点:它们的最终目的都是为了提升效率文章来源地址https://www.toymoban.com/news/detail-804682.html

到了这里,关于HiveSQL中的分区与分桶的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据库分区

    1、与单个磁盘或文件系统分区相比,可以存储更多的数据。 2、通过删除与增加那些数据有关的分区,很容易地删除或增加那些数据。 3、一些查询可以得到极大的优化。 4、通过跨多个磁盘甚至服务器来分散数据查询,来获得更大询吞吐量。 5、MySQL5.5之后支持所有函数的分

    2024年02月08日
    浏览(36)
  • 大数据开发之Hive(查询、分区表和分桶表、函数)

    1、查询语句语法 2、书写次序和执行次序 顺序 书写次序 书写次序说明 执行次序 执行次序说明 1 select 查询 from 先执行表与表直接的关系 2 from 先执行表与表直接的关系 on 先执行表与表直接的关系 3 join on 先执行表与表直接的关系 join 先执行表与表直接的关系 4 where 先执行表

    2024年01月17日
    浏览(50)
  • PostgreSQL数据库分区裁剪——constraint exclusion

    constraint exclusion约束排除有如下类型:不使用、对所有表使用、对otherrel使用。首先看一下官方解释:Controls the query planner’s use of table constraints to optimize queries. The allowed values of constraint_exclusion are on (examine constraints for all tables), off (never examine constraints), and partition (examine constr

    2024年02月08日
    浏览(34)
  • hive数据库delete删除部分数据/删除分区内的数据

    在Hive中,删除部分数据是一个常见的操作,特别是当我们需要清除不再需要的数据或者进行数据更新时。Hive提供了多种方式来删除部分数据,本文将介绍其中几种常用的方法。 最简单的方法是删除整个表,这将删除表中的所有数据。可以使用DROP TABLE语句来完成这个操作。下

    2024年02月04日
    浏览(58)
  • 【科研入门】会议、期刊、出版社、文献数据库、引文数据库、SCI分区、影响因子等基础科研必备知识

    大家好,我是洲洲,欢迎关注,一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大家在CSDN后台私信我! 会议论文一定是针对某个学术会议投稿,并且由学术会议的会务组决定是否

    2024年02月11日
    浏览(58)
  • GaussDB云数据库SQL应用系列—分区表管理

    目录 前言 一、分区表基本原理 二、分区表主要优势 三、分区表常见场景 四、GaussDB分区表管理(示例) 示例一:创建范围分区表(RANGE) 示例二:创建哈希分区表(HASH) 示例三:创建列表分区(LIST) 五、总结 前言 本文将介绍GaussDB云数据库的分区表技术,包括原理、优势以

    2024年02月09日
    浏览(46)
  • 4、hive的使用示例详解-事务表、视图、物化视图、DDL(数据库、表以及分区)管理详细操作

    1、apache-hive-3.1.2简介及部署(三种部署方式-内嵌模式、本地模式和远程模式)及验证详解 2、hive相关概念详解–架构、读写文件机制、数据存储 3、hive的使用示例详解-建表、数据类型详解、内部外部表、分区表、分桶表 4、hive的使用示例详解-事务表、视图、物化视图、DDL

    2024年02月09日
    浏览(49)
  • openGauss学习笔记-201 openGauss 数据库运维-常见故障定位案例-执行修改表分区操作时报错

    201.1 执行修改表分区操作时报错 201.1.1 问题现象 执行ALTER TABLE PARTITION时,报错如下。 201.1.2 原因分析 在同一条ALTER TABLE PARTITION语句中,既存在DROP PARTITION又存在ADD PARTITION时,无论它们在语句中的顺序是什么,openGauss总会先执行DROP PARTITION再执行ADD PARTITION。执行完DROP PARTITIO

    2024年01月19日
    浏览(46)
  • Hive ---- 分区表和分桶表

    Hive中的分区就是把一张大表的数据按照业务需要分散的存储到多个目录,每个目录就称为该表的一个分区。在查询时通过where子句中的表达式选择查询所需要的分区,这样的查询效率会提高很多。 1. 创建分区表 2. 分区表读写数据 1)写数据 (1)load 数据准备 在/opt/module/hiv

    2024年02月10日
    浏览(60)
  • Hive 分区表和分桶表

    在《Hive 建表语句解析》文章中,建表的时候我们可以使用 PARTITIONED BY 子句和 CLUSTERED BY 子句来创建分区表和分桶表,为什么要创建分区表和分桶表呢?分区表和分桶表有什么区别呢? 1. 为什么分区 在Hive 查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时

    2023年04月23日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包