HIVE分区,附图说明

本文详细介绍了Hive中的分区和分桶概念,以及如何通过动态分区、多级分区和创建/修复分区来优化查询效率。内容包括基本的分区表创建、数据插入、查询操作,以及分桶的实现方式和查看效果,旨在帮助读者理解如何利用Hive进行高效的大数据管理。

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

快速理解

  • 分区 是 分文件夹,分桶 是 分文件
  • 分区 和 分桶 都能 加速查询

分区

  • 分区是对应一个HDFS上的独立文件夹
  • WHERE分区字段,查询效率更高

0、删库,建库

DROP DATABASE IF EXISTS school;
CREATE DATABASE school LOCATION '/school';

1、创建分区表

DROP TABLE IF EXISTS school.student;
CREATE TABLE school.student (s_id INT)
PARTITIONED BY (grade STRING)  -- 分区表语法
LOCATION '/school/student';

2、插入数据

INSERT INTO TABLE school.student PARTITION(grade='a') VALUES (1),(2);
INSERT INTO TABLE school.student PARTITION(grade='b') VALUES (3);

3、查询分区

SHOW PARTITIONS school.student;

Hue界面结果显示

4、查询时WHERE分区

SELECT * FROM school.student WHERE grade='a';

Hue界面结果显示

5、查看HDFS

动态分区

Dynamic Partition:根据分区字段的值,自动将数据插入到相应的分区

基础配置

-- 开启动态分区功能
SET hive.exec.dynamic.partition=true;
-- 设置动态分区为非严格模式
SET hive.exec.dynamic.partition.mode=nonstrict;
-- 全部节点上,最多可创建多少个动态分区
SET hive.exec.max.dynamic.partitions=1000;
-- 单个节点上,最多可创建多少个动态分区
SET hive.exec.max.dynamic.partitions.pernode=100;
-- 整个MR Job中,最大可以创建多少个HDFS文件
SET hive.exec.max.created.files=100000;
-- 当有空分区生成时,是否抛出异常
SET hive.error.on.empty.partition=false;

写法

分区字段写最尾

SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;

INSERT INTO TABLE school.student PARTITION(grade)
SELECT
    s_id,
    grade
FROM school.student;

SELECT * FROM school.student WHERE grade='b';Hue结果显示(数据续上)

多级分区

实际对应HDFS的层级文件夹

DROP TABLE IF EXISTS school.student2;
CREATE TABLE school.student2 (name STRING,age INT)
PARTITIONED BY (s_id INT,grade STRING)  -- 二级分区
LOCATION '/school/student2';
INSERT INTO TABLE school.student2 PARTITION(s_id=5,grade='c') VALUES ('小黄',13);


创建分区(ALTER分区)

场景:HDSF已有文件夹以及文件,在此创建分区表后,SELECT *SHOW PARTITIONS都为空

ALTER TABLE 表名 ADD IF NOT EXISTS PARTITION(分区字段='分区名');

对表创建(ALTER)分区后,SELECT *SHOW PARTITIONS就都有结果了

修复分区

场景:HDSF已有文件夹以及文件,在此创建分区表后,SHOW PARTITIONS都为空
假如分区有几百个,写几百个ALTER不方便,对此可用MSCK REPAIR TABLE批量修复分区

MSCK REPAIR TABLE 表名;

repair,vn 修理

分桶

-- 建表
DROP TABLE IF EXISTS school.student3;
CREATE TABLE school.student3
(s_id INT,name STRING)
PARTITIONED BY (grade STRING)
CLUSTERED BY (s_id) INTO 3 BUCKETS
LOCATION '/school/student3';
INSERT INTO TABLE school.student3
PARTITION(grade='a')
VALUES
(1,'剑圣'),
(2,'先知'),
(3,'巫妖'),
(4,'守望者'),
(5,'山丘之王');

查看NameNode客户端

分桶号=s_id除以3得到的余数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小基基o_O

您的鼓励是我创作的巨大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值