Hive 分区和分桶总结

2024-02-07 01:48
文章标签 总结 分区 hive 分桶

本文主要是介绍Hive 分区和分桶总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

分区和分桶总结

1、分区

1、分区介绍

2、分区表的操作

3、动态分区

2、分桶表

1、分桶表介绍

2、分桶表的操作

3、分区表和分桶表的区别

参考

分区和分桶总结

1、分区

1、分区介绍

由于数据量过于庞大,使用分区,可以并行的进行处理数据,有点类似于Hadoop当中的切片操作,将数据分开,然后并行去处理,避免去全表扫描。

分区表在生产环境当中用的非常多。分区表实际上就是对应一个在HDFS(或者是其他分布式文件系统)文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件,Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过where子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多。

并且,分区的指定的列其实是伪列,意思是不是真是存在的列。

2、分区表的操作

       具体代码如下:

--建表语句
create table temp_table (
id string comment 'ID',
name string comment '姓名'
)comment '临时表'
partitioned by (day string);--导入数据语句
load data local path 'x' overwrite into table temp_table partition(day='2021-05-01');--增加分区
alter table temp_table add partition(day='2021-05-02') partition(day='2021-05-03');--删除分区
alter table temp_table drop partition(day='2021-05-02'),partition(day='2021-05-03');--查看分区
show partitions temp_table;

       重点需要注意的是partitioned后面的ed,并且,分区字段是不存在列里面的,是一个独立的字段。查询的时候就当作是一个列来进行查询即可。二级分区和一级分区同理,就不重复写了。

load不指定分区的时候,将会放入一个默认的文件夹当中,有时候也会报错,一般需要指定分区。

3、动态分区

不指定固定的分区,而是,根据查询得到的分区字段去进行分区。是按照查询的最后一个字段来作为分区字段,在配置为严格模式下,不能进行动态分区,需要更改配置(Hive版本3之后可以省略partition,默认以最后的字段为分区字段)。代码如下:

insert table temp_table partition(day)
select name, day from temp_table;--配置的信息是
hive.exec.dynamic.partition.mode=nonstrict

2、分桶表

1、分桶表介绍

分区提供一个隔离数据和优化查询的便利方式。不过,并非所有的数据集都可以形成合理的分区。对于一张表或者分区,Hive可以进一步组织成桶,也就是更为细粒度的数据范围划分。

分桶是将数据集分解成更容易管理的若干部分的另一个技术。一般用于数据集极大的情况,进行抽样查询。

分区针对的是数据的存储路径,分桶针对的是数据文件。

只能对一列进行分桶。表可以同时分区和分桶,当表分区时,每个分区下都会有<num_buckets> 个桶。当使用 SORTED BY … 在桶内排序时,指定排序的列和指定分桶的列无需相同。而且分桶表中插入数据的时候必然要执行一次MAPREDUCE,所以分桶表的数据只能通过从结果集查询插入的方式进行导入。

数据分桶的原理:

按照分桶字段的hash值去模除以分桶的个数。当join连接的字段值取hash不够均匀时,多取一个其它字段作为分桶字段;

bucket num = hash_function(bucketing_column) mod num_buckets

2、分桶表的操作

具体代码如下:

--创建分桶表
create table stu_buck(id int, name string)
clustered by (id)   --注意必须要用存在的列
into 4 buckets  --指定桶的个数
row format delimited fields terminated by '\t';

注意:

hive.enforce.bucketing为true时,reduce要设为-1;

hive.enforce.bucketing为false时,reduce要设为和分桶数一致;

如果bucketing为 true,reduce又设成大于1的输,会执行两个job。

3、分区表和分桶表的区别

分区和分桶最大的区别就是分桶随机分割数据库,分区是非随机分割数据库。

因为分桶是按照列的哈希函数进行分割的,相对比较平均;而分区是按照列的值来进行分割的,容易造成数据倾斜。其次两者的另一个区别就是分桶是对应不同的文件(细粒度),分区是对应不同的文件夹(粗粒度)。

当然,分区和分桶可以一起使用。

参考

https://www.bilibili.com/video/BV1EZ4y1G7iL?p=66

https://www.freesion.com/article/23851409747/

 

这篇关于Hive 分区和分桶总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/686180

相关文章

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

解决hive启动时java.net.ConnectException:拒绝连接的问题

《解决hive启动时java.net.ConnectException:拒绝连接的问题》Hadoop集群连接被拒,需检查集群是否启动、关闭防火墙/SELinux、确认安全模式退出,若问题仍存,查看日志... 目录错误发生原因解决方式1.关闭防火墙2.关闭selinux3.启动集群4.检查集群是否正常启动5.

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

MySQL 定时新增分区的实现示例

《MySQL定时新增分区的实现示例》本文主要介绍了通过存储过程和定时任务实现MySQL分区的自动创建,解决大数据量下手动维护的繁琐问题,具有一定的参考价值,感兴趣的可以了解一下... mysql创建好分区之后,有时候会需要自动创建分区。比如,一些表数据量非常大,有些数据是热点数据,按照日期分区MululbU

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用