Hive---分区表和分桶表

本文详细介绍了Hive中的分区表和分桶表的区别及其应用场景。分区表使用表外字段进行逻辑划分,有助于避免全表扫描提高查询效率;分桶表则进一步细化数据管理,利用表内字段实现更高效的数据检索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分区表和分桶表区别如下:

 1、分区使用的是表外字段,需要指定字段类型;分桶使用的是表内字段,已经知道字段类型,不需要再指定。

 2、分区通过关键字partitioned by(partition_name string)声明,分桶表通过关键字clustered by(column_name) into 3 buckets声明。

 3、分区划分粒度较粗,分桶是更细粒度的划分、管理数据,可以对表进行先分区再分桶的划分策略。

 4、分区是个伪列,只对应着文件存储路径上的一个层级。

一、hive分区表

  hive表分区是一种逻辑上的数据划分,分区字段使用的是表外字段,并且不保存数据,只是hdfs文件存储目录的一个层级。一个表可以指定多个分区,我们在插入数据的时候指定分区,就是新建一个子目录,或者在原来目录的基础上来添加数据。分区目的主要是避免全表扫描,从而提升查询和计算效率。按分区类型划分,可以分为静态分区、动态分区和混合分区。
分区表创建:

create table if not exists tab_partition(
id int,
name string,
age int
)
PARTITIONED BY (year string , month string)
row format delimited 
fields terminated by ','
stored as orc
;

静态分区加载数据时要指定分区:

load data local inpath '/data/test.txt' into table tab_partition partition(year='2019',month='05'); 

  在使用静态分区的时候,加载数据要指定分区,这个操作过程比较麻烦;而动态分区不会有这些不必要的操作,动态分区可以根据查询得到的数据动态地分配到分区中去,动态分区与静态分区最大的区别是不指定分区目录,由系统自己进行过选择。
  动态分区模式可以分为严格模式(strict)和非严格模式(non-strict),二者的区别是:严格模式在进行插入的时候至少指定一个静态分区,而非严格模式在进行插入的时候可以不指定静态分区。

首先启动动态分区的功能,在hive-site.xml文件中进行如下的配置:

<property>
    <name>hive.support.concurrency</name>
    <value>true</value>
</property>
<property>
    <name>hive.exec.dynamic.partition.mode</name>
    <value>nonstrict</value>
</property>
<property>
    <name>hive.txn.manager</name>
    <value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
</property>
<property>
    <name>hive.compactor.initiator.on</name>
    <value>true</value>
</property>
<property>
    <name>hive.compactor.worker.threads</name>
    <value>1</value>
</property>
<property>
    <name>hive.enforce.bucketing</name>
    <value>true</value>
</property>

动态分区加载数据不能使用load,要使用insert into方式:

insert into tab_partition partition(year,month) select id,name,age,year,month from part_tmp;

混合分区加载数据方式:

insert into tab_partition partition(year='2019',month) select id,name,age,month from part_tmp;

二、hive分桶表

  单个分区或者表中的数据量越来越大,当分区不能更细粒的划分数据时,所以会采用分桶技术将数据更细粒度的划分和管理。分桶表使用的是表内字段。

分桶表创建:

create table if not exists tab_bucket(
id int,
name string,
age int
)
clustered by (id) into 4 buckets
row format delimited
fields terminated by ','
stored as orc
;

分桶表加载数据要使用insert into方式:

需要确保reduce 的数量与表中的bucket 数量一致,有如下两种方式:

//方式一:让hive强制分桶,自动按照分桶表的bucket进行分桶(推荐)
set hive.enforce.bucketing = true;
insert into table tab_bucket select id,name,age from tmp;
//方式二:手动设置reduce数量,并在 SELECT 后增加CLUSTER BY 语句
set mapreduce.job.reduces = num;
set mapreduce.reduce.tasks = num;
insert into table tab_bucket select id,name,age from tmp cluster by id;

分桶表数据查询:

//查询全部数据
select * from tab_bucket;
//抽样查询,按id的哈希值对4取余,查询桶1的数据
select * from tab_bucket tablesample(bucket 1 out of 4 on id);

分区分桶表创建:

create table if not exists tab_partition_bucket(
id int,
name string,
age int
)
partitioned by (province string)
clustered by (id) sorted by (id desc) into 3 buckets
row format delimited 
fields terminated by ','
stored as orc
;

原文:https://www.cnblogs.com/jvStarBlog/p/10890957.html

### Hive 的概念及使用方法 #### 什么是Hive 中的是一种用于组织数据的技术,它通过对指定列的值进行哈希运算,并将其配到不同的中。这种技术有助于提升查询性能,尤其是在大规模数据集上执行连接操作时[^1]。 #### 创建 要创建一个,需要在 `CREATE TABLE` 语句中定义 `CLUSTERED BY` 子句。以下是创建的基本语法: ```sql CREATE TABLE bucketed_table ( id INT, name STRING, value DOUBLE ) CLUSTERED BY (id) INTO 32 BUCKETS; ``` 上述代码片段展示了如何创建一张名为 `bucketed_table` 的,其中 `id` 列被用来作为依据,整个会被为 32 个[^3]。 #### 填充 为了使生效,在向插入数据时,必须启用动态功能并设置相应的参数。以下是一些常用的配置项及其含义: - `set hive.enforce.bucketing = true;`: 启用强制模式。 - `SET hive.exec.dynamic.partition.mode=nonstrict;`: 设置动态区模式为非严格模式(如果涉及区)。 下面是一个完整的示例,展示如何将数据写入: ```sql -- 开启支持 SET hive.enforce.bucketing = true; -- 插入数据到 INSERT OVERWRITE TABLE bucketed_table SELECT * FROM source_table DISTRIBUTE BY id; ``` 在此过程中,`DISTRIBUTE BY` 关键字确保每一条记录按照 `id` 列的值均匀布到各个中。 #### 查询优化 当两张已经按相同的字段(如 `id` 字段)进行 JOIN 操作时,无需再对整张做笛卡尔积,从而显著减少计算量资源消耗[^2]。 #### 抽样查询 除了常规查询外,还可以通过抽样的方式访问部的内容。例如,假设某有 64 个,则可以通过如下 SQL 获取第 3 个的数据样本: ```sql SELECT * FROM bucketed_table TABLESAMPLE(BUCKET 3 OUT OF 32); ``` 这里需要注意的是,实际抽取的具体号取决于达式的逻辑关系[^4]。 #### Spark 集成 对于更复杂的析需求,可借助 Apache Spark 来读取 Hive 并实施高效的无 shuffle Join 操作。这通常涉及到调整 Spark 应用程序的相关属性以匹配底层存储结构[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值