hive学习—分区、分桶和索引

本文介绍了Hive中的分区(partition)和桶(bucket)概念,通过实例展示了如何创建分区表和桶表,并解释了这两种机制如何提高查询效率。
部署运行你感兴趣的模型镜像
hive引入partition和bucket的概念,中文翻译分别为分区和桶(我觉的不是很合适,但是网上基本都是这么翻译,暂时用这个吧),这两个概念都是把数据划分成块,分区是粗粒度的划分桶是细粒度的划分,这样做为了可以让查询发生在小范围的数据上以提高效率。
[b]分区的作用:使用分区可以加快数据分片的查询速度。
桶的作用:(1)获得更高效的查询处理效率,桶为表加上了额外的结构。
(2)"取样"更高效。在处理大规模数据集时,在开发和修改查询阶段,如果能在数据集的一小部分数据上试进行查询,会带来很多方便。[/b]
首先介绍分区的概念,还是先来个例子看下如果创建分区表:
create table logs_partition(ts bigint,line string) --ts timestamp line 每一行日志
partitioned by (dt string,country string) -- 分区列 dt 日志产生日期

创建分区表需要在定义表的时候声明分区列,这个分区列是个比较有意思的东西下面来看看,向表中导入数据:
load data local inpath 'input/hive/partitions/file1'
into table logs_partition
partition(dt='2001-01-01',country='GB');

.......
-- 看下表的结构
hive> desc logs_partition;
OK
ts bigint None
line string None
dt string None
country string None

# Partition Information
# col_name data_type comment

dt string None
country string None
Time taken: 0.265 seconds, Fetched: 10 row(s)


查看一个表的所有分区
hive> show partitions logs_partition;
OK
dt=2001-01-01/country=GB
dt=2001-01-01/country=US
dt=2001-01-02/country=GB
dt=2001-01-02/country=US
Time taken: 0.186 seconds, Fetched: 4 row(s)


导入完数据后看下hive数据仓库表logs_partition下的文件目录结构
/user/hive/warehouse/logs_partition
Screenshot from 2013-10-10 17:46:25
[b]看到了吧分区列都成了目录了,这样查询的时候就会定位到某个目录下而大大提高了查询效率,在查看表结构的时候分区列跟其他列并无区别,[/b]看个查询语句:
SELECT ts, dt, line
FROM logs
WHERE country='GB';

1 2001-01-01 Log line 1
2 2001-01-01 Log line 2
4 2001-01-02 Log line 4
Time taken: 36.316 seconds, Fetched: 3 row(s)


这个查询只会查询file1, file2, file4这三个文件还有一个有趣的问题就是,查看下数据文件fieldX
里面都只包含两列ts和line并不包含dt和country这两个分区列,但是从查询结果看分区列和非分区列并无差别,实际上分区列都是从数据仓库的分区目录名得来的。

接下来说说桶,桶是更为细粒度的数据范围划分,它能使一些特定的查询效率更高,比如对于具有相同的桶划分并且jion的列刚好就是在桶里的连接查询,还有就是示例数据,对于一个庞大的数据集我们经常需要拿出来一小部分作为样例,然后在样例上验证我们的查询,优化我们的程序。

下面看看如何创建带桶的表
create table bucket_user (id int,name string)
clustered by (id) into 4 buckets;


关键字clustered声明划分桶的列和桶的个数,这里以用户的id来划分桶,划分4个桶。
以下为了简便划分桶的列简称为桶列
hive会计算桶列的hash值再以桶的个数取模来计算某条记录属于那个桶

向这种带桶的表里面导入数据有两种方式,一种是外部生成的数据导入到桶表,一种是利用hive来帮助你生成桶表数据
由于hive在load数据的时候不能检查数据文件的格式与桶的定义是否匹配,如果不匹配在查询的时候就会报错,所以最好还是让hive来帮你生成数据,简单来说就是利用现有的表的数据导入到新定义的带有桶的表中,下面来看看:
已经存在的表:
hive> select * from users;
OK
0 Nat
2 Joe
3 Kay
4 Ann


hive> set hive.enforce.bucketing=true --必须设置这个数据,hive才会按照你设置的桶的个数去生成数据

下面把user的数据导入到bucketed_users中

insert overwrite table bucketed-users
select * from users;


然后见证奇迹的时刻:
hive> dfs -ls /user/hive/warehouse/bucketed_users;
-rw-r--r-- 1 root supergroup 12 2013-10-10 18:48 /user/hive/warehouse/bucketed_users/000000_0
-rw-r--r-- 1 root supergroup 0 2013-10-10 18:48 /user/hive/warehouse/bucketed_users/000001_0
-rw-r--r-- 1 root supergroup 6 2013-10-10 18:48 /user/hive/warehouse/bucketed_users/000002_0
-rw-r--r-- 1 root supergroup 6 2013-10-10 18:48 /user/hive/warehouse/bucketed_users/000003_0


hive> dfs -cat /user/hive/warehouse/bucketed_users/000000_0;
0Nat
4Ann

下面来看看利用bucket来对示例数据进行查询
---带桶的表
select * from bucketed_users
tablesample(bucket 1 out of 4 on id);

---不带桶的表
select * from users
tablesample(bucket 1 out of 4 on rand());

tablesample的作用就是让查询发生在一部分桶上而不是整个数据集上,上面就是查询4个桶里面第一个桶的数据
相对与不带桶的表这无疑是效率很高的,因为同样都是需要一小部分数据,但是不带桶的表需要使用rand()函数,需要在整个数据集上检索。

您可能感兴趣的与本文相关的镜像

Yolo-v8.3

Yolo-v8.3

Yolo

YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的Joseph Redmon 和Ali Farhadi 开发。 YOLO 于2015 年推出,因其高速和高精度而广受欢迎

<think>我们正在比较Paimon与Hive分区机制上的差异。根据用户提供的参考引用,我们知道Doris/SelectDB有两层数据划分区。用户想了解Paimon与Hive在这方面的对比。首先,我们需要回顾Hive分区机制:-Hive分区:通常按照某个字段(如日期)将数据划到不同的目录中。例如,按天分区,每个分区对应一个目录。查询时可以通过分区裁剪(PartitionPruning)来跳过不相关的分区,减少数据扫描量。-Hive:将数据按照某个字段的哈希值成多个文件()。每个是一个文件。可以用于提高采样效率、加速JOIN操作(Map端JOIN)等。接下来,我们了解Paimon(原FlinkTableStore)的分区机制:Paimon是一个流批统一的存储格式,设计用于构建实时数据湖。它支持分区(类似于Hive),但有一些不同的设计点。1.**分区**:Paimon的分区Hive类似,也是按照某个字段进行目录划。例如,按天分区,每天的数据存储在一个目录下。查询时同样可以利用分区裁剪。2.****:Paimon的机制与Hive有所不同。在Paimon中,的概念被实现为“”(bucket),每个是一个目录,里面包含多个数据文件。Paimon的是基于主键(或指定字段)的哈希值进行的,并且每个对应一个写器(writer),这样可以避免小文件问题。Paimon的数在表创建时固定,且每个内的数据会进一步按照主键排序(LSM树结构),这有利于点查范围查询。3.**与Hive的主要差异**:-**的目的**:Hive主要是为了优化采样某些JOIN操作,而Paimon的是为了数据合并(compaction)以及优化查询(特别是点查)。-**文件组织**:Hive中每个是一个文件,而Paimon中每个是一个目录,里面包含多个数据文件(由于LSM结构,会有多个层级的文件,但通过compaction合并)。-**更新支持**:Paimon支持主键更新,因此的设计也支持高效更新(通过将更新路由到同一个,然后进行合并)。Hive传统上不支持更新(ACIDHive表支持,但使用较少)。-**流式支持**:Paimon设计时就考虑了流式读写(如FlinkCDC),因此机制也支持高效的数据写入compaction。Hive则主要面向批处理。4.**查询优化**:-在Hive中,查询可以利用分区裁剪裁剪(如果查询条件包含字段)来减少扫描的数据量。-在Paimon中,同样支持分区裁剪裁剪。此外,由于每个内数据按主键排序,对于点查范围查询,Paimon可以通过索引(如LSM树的SSTable)快速定位数据。总结对比:|特性|Hive|Paimon||--------------|-------------------------------|---------------------------------||**分区**|支持,按目录划|支持,按目录划||****|支持,每个一个文件|支持,每个一个目录(内含多个文件)||**更新支持**|有限(需要ACID表)|支持(主键更新)||**流式支持**|不支持(批处理为主)|支持(流批一体)||**查询优化**|分区裁剪、裁剪|分区裁剪、裁剪,内排序优化||**适用场景**|批处理、数据仓库|实时数据湖、流批一体|举例说明:在Paimon中,创建表时可以指定分区:```sqlCREATETABLEmy_table(idINT,nameSTRING,dtSTRING,PRIMARYKEY(id)NOTENFORCED)PARTITIONEDBY(dt)WITH('bucket'='4'--数为4);```这样,数据会先按`dt`分区,然后在每个分区内,按`id`的哈希值成4个。每个内,数据按`id`排序存储。在Hive中,创建分区表:```sqlCREATETABLEmy_table(idINT,nameSTRING)PARTITIONEDBY(dtSTRING)CLUSTEREDBY(id)INTO4BUCKETS;```因此,Paimon的分区机制在形式上与Hive相似,但底层实现优化目标有所不同,特别是Paimon为支持更新流处理所做的设计。相关问题:1.Paimon的机制如何避免小文件问题?2.Paimon的LSM结构在中是如何应用的?3.在Paimon中,数如何影响查询性能?4.Paimon与Hive在更新数据时的处理流程有何不同?</think>### Paimon 与 Hive 分区机制对比析 #### 1. **分区机制差异** - **Hive 分区** 采用静态目录划(如 `day=20220101`),通过分区键裁剪减少扫描范围。例如: ```sql SELECT * FROM user_table WHERE day = '2022-01-01'; -- 仅扫描目标分区目录 ``` 分区需预先定义,新增分区需手动或动态添加。 - **Paimon 分区** 支持动态分区(如时间字段),**自动创建新分区目录**,无需预定义[^1]。额外提供: - **分区生命周期管理**:自动清理过期分区(如保留最近30天)。 - **多级分区**:支持 `PARTITIONED BY (country, city)` 嵌套结构,优化多维查询。 #### 2. **机制差异** - **Hive ** 基于哈希(固定数),每个存储为独立文件: ```sql CLUSTERED BY (id) INTO 4 BUCKETS; -- 数据按id哈希到4个文件 ``` 作用:加速采样(`TABLESAMPLE`)JOIN,但**不支持内排序**。 - **Paimon ** 融合与存储优化: - **主键**:通过 `PRIMARY KEY(id)` 定义,数据按主键哈希。 - **LSM 树结构**:每个内数据按主键排序存储,优化点查范围查询[^1]。 - **动态合并**:自动合并小文件(Compaction),避免Hive的小文件问题。 #### 3. **核心优化能力对比 | 特性 | Hive | Paimon | |---------------------|-------------------------------|---------------------------------| | **分区创建** | 手动/动态添加 | 自动创建 + 生命周期管理 | | **结构** | 简单哈希 | 主键 + LSM 树排序 | | **点查优化** | 需全表扫描 | 主键索引直达内数据 | | **更新支持** | 仅ACID表有限支持 | 原生支持UPSERT(主键更新) | | **流批一体** | 不支持 | 支持实时数据写入与批量查询 | #### 4. **查询裁剪示例 Paimon 实现两级裁剪(优于 Hive 的单层裁剪): ```sql SELECT * FROM user_table WHERE id = 5122 AND day = '2022-01-01'; ``` - **分区裁剪**:跳过非 `2022-01-01` 分区目录。 - **裁剪**:通过主键 `id` 哈希定位到特定,避免扫描整个分区[^1]。 #### 5. **适用场景总结 - **Hive**:批处理场景,分区用于粗粒度数据筛选,用于JOIN优化。 - **Paimon**: - 实时数据湖场景(CDC数据接入) - 高频点查(如主键查询) - 需要动态分区管理的流式作业 > 关键结论:**Paimon 通过主键+LSM结构,在实时更新、点查性能、小文件治理上显著优于 Hive 的传统机制**[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值