Hive 桶表的创建、数据导入、查询与导出

1. 什么是桶表?

  • 定义:桶表是 Hive 中一种用于优化查询性能的数据存储方式。它通过对指定列(分桶列)的值进行哈希(Hash)计算,然后根据哈希值将数据均匀地分配到多个文件(桶)中。
  • 核心目的
    • 优化 Join 操作:当两个表在 Join Key 上有相同的分桶时,Hive 可以执行高效的分桶连接(Bucket-to-Bucket Join),大幅减少数据 shuffle。
    • 高效采样查询:可以直接查询特定的一个或几个桶,而无需扫描整个表,适用于数据分析和采样。
    • 数据均匀分布:相比分区表可能出现的一个分区过大的情况,桶表能更好地将数据分散到多个文件中。

. 创建桶表

复制代码
create table 表名 (
    id int,
    name string 
)
clustered by (id) ---- 指定分桶列
into 3 buckets ----指定桶的数量
stored as orc; ------ 推荐使用高效的列式存储格式

向桶表导入数据

核心原则 :不能使用 LOAD DATA 命令直接向桶表加载数据,因为 LOAD DATA 只是移动文件,不会执行分桶逻辑。必须使用 INSERT ... SELECT 语句。

1.创建临时中转表:创建一个与源数据文件格式(如文本、CSV)匹配的普通表。

复制代码
create table student_temp (
    id int,
    name string
)
row format delimited 
fields terminated by ',';

2.加载数据到临时表

复制代码
load data local inpath '/path/to/student.txt' overwrite into table student_temp;

3.设置分桶参数

复制代码
set hive.enforce.bucketing = true;      -- 强制 Hive 执行分桶逻辑
set mapreduce.job.reduces = 3;          -- 设置 Reduce 任务数等于桶数

4.插入数据到桶表

复制代码
insert overwrite table student_b
select id, name from student_temp;

查询桶表数据

普通查询:与查询普通表无异。

sql

复制代码
select * from student_b where id = 1001;
  • 抽样查询 :使用 tablesample 子句高效查询特定桶的数据。

    sql

    复制代码
    -- 查询第 2 个桶的数据
    select * from student_b tablesample(bucket 2 out of 3 on id);
    • 注意 :如果 Hive 启用了 CBO(基于成本的优化器),tablesample 可能会报错。解决方案是临时关闭 CBO:

      sql

      复制代码
      set hive.cbo.enable = false;

. 查看桶表的 HDFS 存储

  • 桶表在 HDFS 上的存储路径可以通过 describe extended student_b; 命令查看 location 字段获得。

  • 在该路径下,会看到与桶数相等的多个数据文件(如 000000_0, 000001_0, 000002_0),每个文件对应一个桶。

  • 使用 HDFS 命令查看: bash

    运行

    复制代码
    hdfs dfs -ls /user/hive/warehouse/your_db.db/student_b

从桶表导出数据

可以使用 insert overwrite local directory 将桶表数据导出到本地文件系统。

sql

复制代码
-- 导出为逗号分隔的文本文件
insert overwrite local directory '/opt/module/hive/student_b_export'
row format delimited fields terminated by ','
select * from student_b;
  • 导出的结果会是多个文件(通常与 Reduce 任务数相同),每个文件包含一部分数据。
  • 如果希望合并为单个文件,可以在导出前设置 set mapreduce.job.reduces = 1;
相关推荐
juniperhan20 小时前
Flink 系列第4篇:Flink 时间系统与 Timer 定时器实战精讲
java·大数据·数据仓库·flink
juniperhan1 天前
link 系列第7篇:Flink 状态管理全解析(原理+类型+存储+实操)
大数据·数据仓库·flink
juniperhan1 天前
Flink 系列第6篇:Watermark 水印全解析(原理+实操+避坑)
大数据·数据仓库·flink
武子康2 天前
大数据-264 实时数仓-MySQL Binlog配置详解:从原理到实践|数据恢复与主从复制实战
大数据·hadoop·后端
武子康2 天前
大数据-265 实时数仓-Canal MySQL Binlog配置详解:从原理到实践|数据恢复与主从复制实战
大数据·hadoop·后端
晓纪同学2 天前
WPF-03 第一个WPF程序
大数据·hadoop·wpf
2501_933329552 天前
技术深度剖析:Infoseek 字节探索舆情处置系统的全链路架构与核心实现
大数据·数据仓库·人工智能·自然语言处理·架构
xiaoyaohou112 天前
024、大数据技术栈概览:Hadoop、Spark与Flink
大数据·hadoop·spark
虚幻如影2 天前
Hive 中“STRING类型无需显式指定长度
数据仓库·hive·hadoop
荒川之神2 天前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle