Hive的分区、分桶

Hive的分区、分桶

Hive分区

在大数据中,最常见的一种思想就是 分治,我们可以 把大的文件切割划分成一个个的小的文件,这样每次操作一个个小的文件就会很容易了,同样的道理,在hive当中也是支持这种思想的,就是我们可以把大的数据,按照每天或者每小时切分成一个个小的文件,这样去操作小的文件就会容易很多了。

Hive的分区、分桶

分区的优点:查询范围变小,避免全盘扫描,加快查询效率

缺点:会产生很多不连续的小文件、如果分区过多反而会降低查询效率

静态分区(SP)

借助于物理的文件夹分区,实现快速检索的目的。

一般对于查询比较频繁的列设置为分区列。

分区查询的时候直接把对应分区中所有数据放到对应的文件夹中

创建单分区表

CREATE TABLE IF NOT EXISTS t_student (
sno int,
sname string
) partitioned by(grade int)
row format delimited fields terminated by ',';
--  分区的字段不要和表的字段相同。相同会报错error10035

载入数据:将相同分区的数据放到一个表里
1,bfy01,1
2,bfy02,1
3,bfy03,1
4,bfy04,1
5,bfy05,1
//student_1.txt

6,bfy06,2
7,bfy07,2
8,bfy08,2

load data local inpath '/usr/local/soft/bigdata19/hivedata/student_1.txt' into table t_student partition(grade=1);

--分区的列的值是分区的值,不是原来的值,即使分区的列值与分区值不一样,在进入分区后也会变成分区值,它不会检查数据,认为只要是进入到这个分区的就是这个分区的值。

多分区表语法

CREATE TABLE IF NOT EXISTS t_teacher (
tno int,
tname string
) partitioned by(grade int,clazz int)
row format delimited fields terminated by ',';
--注意:前后两个分区的关系为父子关系,也就是grade文件夹下面有多个clazz子文件夹。

数据:
1,bfy01,1,1
2,bfy02,1,1

3,bfy03,1,2
4,bfy04,1,2

7,bfy05,2,1
8,bfy06,2,1

load data local inpath '/usr/local/soft/bigdata19/hivedata/teacher_1.txt' into table t_teacher partition(grade=1,clazz=1);

分区表查询

select * from t_student where grade = 1;

// 全表扫描,不推荐,效率低
select count(*) from students_pt1;

// 使用where条件进行分区裁剪,避免了全表扫描,效率高
select count(*) from students_pt1 where grade = 1;

// 也可以在where条件中使用非等值判断
select count(*) from students_pt1 where grade=1;

查看分区

show partitions t_student;

添加分区

alter table t_student add partition (grade=5);

alter table t_student add partition (grade=5) location '指定数据文件的路径';

删除分区

alter table t_student drop partition (grade=5);

动态分区(DP)

  • 动态分区(DP)dynamic partition
  • 静态分区与动态分区的 主要区别在于静态分区是手动指定,而动态分区是通过数据来进行判断。
  • 详细来说,静态分区的列是在编译时期通过用户传递来决定的; 动态分区只有在SQL执行时才能决定

开启动态分区

表示开启动态分区
hive> set hive.exec.dynamic.partition=true;

表示动态分区模式:strict(需要配合静态分区一起使用)、nostrict
strict: insert into table students_pt partition(dt='anhui',pt) select ......,pt from students;

hive> set hive.exec.dynamic.partition.mode=nonstrict;

动静态分区的优缺点

  1. 优点:不用手动指定了,自动会对数据进行分区
  2. 缺点:可能会出现数据倾斜

Hive分桶

分区提供了一个隔离数据和优化查询的便利方式,不过并非所有的数据都可形成合理的分区,尤其是需要确定合适大小的分区划分方式
不合理的数据分区划分方式可能导致有的分区数据过多,而某些分区没有什么数据的尴尬情况
分桶是将数据集分解为更容易管理的若干部分的另一种技术。
分桶就是将数据按照字段进行划分,可以将数据按照字段划分到多个文件当中去。

分桶原理

Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。

数据分桶优势

方便抽样

​ 使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便

提高join查询效率

​ 获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。

分桶和分区的区别

首先,分区和分桶是两个不同的概念,很多资料上说需要先分区在分桶,其实不然,分区是对数据进行划分,而分桶是对文件进行划分。

​ 当我们的分区之后,最后的文件还是很大怎么办,就引入了分桶的概念。

将这个比较大的文件再分成若干个小文件进行存储,我们再去查询的时候,在这个小范围的文件中查询就会快很多。

分桶操作

开启分桶支持
set hive.enforce.bucketing=true;

数据准备(id,name,age)

1,tom,11
2,cat,22
3,dog,33
4,hive,44
5,hbase,55
6,mr,66
7,alice,77
8,scala,88

创建一个普通的表

create table psn31
(
id int,
name string,
age int
)
row format delimited
fields terminated by ',';

将数据load到这张表中

load data local inpath '文件在Linux上的绝对路径' into table psn31;

创建分桶表

create table psn_bucket
(
id int,
name string,
age int
)
clustered by(age) into 4 buckets
row format delimited
fields terminated by ',';

将数据insert到表psn_bucket中

(注意:这里和分区表插入数据有所区别,分区表需要select 和指定分区,而分桶则不需要)

insert into psn_bucket select id,name,age from psn31;

在Hive进行查询

-- tablesample是抽样语句,语法:TABLESAMPLE(BUCKET x OUT OF y)
-- 分桶语句中的分母表示的是数据将会被散列的桶的个数,分子表示将会选择的桶的个数。

-- x表示从哪个bucket开始抽取。
-- 例如,table总bucket数为32,tablesample(bucket 2 out of 2)
-- 表示总共抽取(2/2=)1个bucket的数据,分别为第2个bucket和第(2+2=)4个bucket的数据
-- y必须是table总bucket数的倍数或者因子。hive根据y的大小,决定抽样的比例。
-- 例如,table总共分了4份,当y=2时,抽取(4/2=)2个bucket的数据,当y=8时,抽取(4/8=)1/2个bucket的数据

select * from psn_bucket tablesample(bucket 3 out of 2);
随机取值(设置因子,桶的个数/因子)
这里就是取2号桶和4号桶,取2个

select * from psn_bucket tablesample(bucket 2 out of 4);
随机取值(设置因子,桶的个数/因子)
这里就是取2号桶,取一个

select * from psn_bucket tablesample(bucket 2 out of 8);
随机取值(设置倍数,倍数/桶的个数)
这里就是取2号桶 1/2个数据
取出来是一条数据

抽样命令TABLESAMPLE(BUCKET x OUT OF y)中,y必须是表格中分桶数的倍数或者因子。Hive根据y的大小,决定抽样的比例。x表示从哪个桶开始抽取。例如,表格的总分桶数为16,tablesample(bucket 3 out of 8),表示总共抽取(16/8=)2个bucket的数据,分别为第3个桶和第(3+8=)11个桶的数据

Original: https://www.cnblogs.com/bfy0221/p/16693639.html
Author: 伍点
Title: Hive的分区、分桶

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/684092/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 剑指offer计划25(模拟中等)—java

    1.1、题目1 剑指 Offer 29. 顺时针打印矩阵 1.2、解法 常规开头,先判断特殊情况,然后创建四个变量存放矩阵四边的长度限制。创建res数组存放结果。循坏开始,遍历完一…

    技术杂谈 2023年7月25日
    065
  • 初看Spring Security一脸懵逼,看懂直接跪下

    Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架, 提供了完善的 认证机制和方法级的 授权功能。是一款非常优秀的权限管理框架。它的核心是一组过滤器链…

    技术杂谈 2023年6月21日
    074
  • nodejs队列

    nodejs队列 创建具有指定并发性的队列对象。添加到队列的任务以并行方式处理(直到并发性限制)。如果所有的worker都在进行中,任务就会排队,直到有一个worker可用。wor…

    技术杂谈 2023年5月31日
    082
  • Vue-Express

    1、移动端常用UI组件库 1、Vant https://youzan.github.io/vant 2、CodeUI https://didi.github.io/cube-ui …

    技术杂谈 2023年6月1日
    0101
  • PYTORCH: 60分钟 | 神经网络

    神经网络可以使用 torch.nn包构建。 现在你已经对autograd有所了解, nn依赖 autograd 定义模型并对其求微分。 nn.Module 包括层,和一个返回 ou…

    技术杂谈 2023年7月25日
    063
  • Clickhouse入门及实践

    ClickHouse安装 采用doker安装测试: 拉取服务端 docker pull yandex/clickhouse-server 拉取客户端 docker pull yan…

    技术杂谈 2023年7月10日
    083
  • FileReader error: The object is already busy reading Blobs

    解决方案: reader读取时候,先判断一下readyState值,如果不是loading的话再执行读取。 readyState&#xA0; FileReader <…

    技术杂谈 2023年6月1日
    077
  • ping: sina.cn: Name or service not known

    该方法针对Ubuntu18及以后版本。 第一次遇到ping:报错Name or service not known这个问题在百度上找了很久说的都是什么修改 /etc/resolv….

    技术杂谈 2023年6月21日
    0118
  • google chrome 浏览器插件2

    mate translator 翻译软件比 IM translator 好一点。 Original: https://www.cnblogs.com/welhzh/p/155722…

    技术杂谈 2023年6月1日
    0127
  • MySQL — 数据控制语言

    DCL 全称 Data Control Language。数据控制语言,用来创建数据库用户、控制数据库的访问权限。 1、用户管理 select * from user; 只能在指定…

    技术杂谈 2023年7月11日
    0100
  • ToStringBuilder如何忽略null和空字符串

    日常开发中,经常用org.apache.commons.lang3.builder.ToStringBuilder工具类来记录日志,比如: 输出如下: 从结果上看: 行1:也就是O…

    技术杂谈 2023年5月31日
    098
  • Java并发编程:线程池

    一、为什么使用线程池 使用线程的时候直接就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频…

    技术杂谈 2023年7月11日
    057
  • 使用ThreadLocal请务必remove

    特别注意,web容器的线程是重复使用的,web容器使用了线程池,当一个请求使用完某个线程,该线程会放回线程池被其它请求使用,这就导致一个问题,不同的请求还是有可能会使用到同一个线程…

    技术杂谈 2023年5月31日
    082
  • 实现Kubernetes可观测性的3个最佳工具

    一个管理和实施得当的可观测性系统为DevOps提供了细化的洞察力,可用于调试和治愈复杂系统。可观察性将监控、警报和日志与指标可视化及其分析相结合。它允许开发团队详细了解Kubern…

    技术杂谈 2023年6月1日
    0104
  • Xcode添加库文件framework (转)

    首先需要了解一下iOS中静态库和动态库、framework的概念 静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别…

    技术杂谈 2023年5月31日
    0113
  • WSL VS Code Server for WSL closed unexpectedly

    直接在管理员PowerShell中WSL –shutdown 本博客是个人工作中记录,遇到问题可以互相探讨,没有遇到的问题可能没有时间去特意研究,勿扰。另外建了几个QQ…

    技术杂谈 2023年6月1日
    0101
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球