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;
相关推荐
tsyjjOvO2 天前
SpringMVC 从入门到精通
数据仓库·hive·hadoop
Francek Chen3 天前
【大数据存储与管理】分布式数据库HBase:05 HBase运行机制
大数据·数据库·hadoop·分布式·hdfs·hbase
zzzzzwbetter3 天前
Hadoop完全分布式部署-Master的NameNode以及Slaver2的DataNode未启动
大数据·hadoop·分布式
weixin_449310843 天前
ETL转换和数据写入小满OKKICRM的技术细节
数据仓库·php·etl
IvanCodes3 天前
Hive IDE连接及UDF实战
ide·hive·hadoop
yumgpkpm3 天前
华为昇腾910B 开源软件GPUStack的介绍(Cloudera CDH、CDP)
人工智能·hadoop·elasticsearch·flink·kafka·企业微信·big data
lifewange4 天前
Hive数据库
数据库·hive·hadoop
五月天的尾巴5 天前
hive数据库模糊查询表名
hive·查询表名
蓝魔Y5 天前
hive—1.1、执行优化
hive
快乐非自愿5 天前
OpenClaw 生态适配:Hadoop/Hive 技能现状与企业级集成方案
大数据·hive·hadoop·分布式·openclaw