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;
相关推荐
8***a8151 天前
从0到1部署Tomcat和添加servlet(IDEA2024最新版详细教程)
hive·servlet·tomcat
5***79002 天前
JavaScript生成器函数
hive·tidb·consul
顧棟3 天前
HDFS元数据与auditlog结合Hive元数据统计分析
hive·hadoop·hdfs
z***89713 天前
【分布式】Hadoop完全分布式的搭建(零基础)
大数据·hadoop·分布式
Kevinyu_3 天前
责任链模式
java·hadoop·责任链模式
yumgpkpm3 天前
腾讯云TBDS与CDH迁移常见问题有哪些?建议由CDH迁移到CMP 7.13 平台(类Cloudera CDP,如华为鲲鹏 ARM 版)
hive·hadoop·zookeeper·flink·spark·kafka·hbase
hexionly3 天前
数据仓库·架构,建模(二)
数据仓库
yumgpkpm4 天前
数据可视化AI、BI工具,开源适配 Cloudera CMP 7.3(或类 CDP 的 CMP 7.13 平台,如华为鲲鹏 ARM 版)值得推荐?
人工智能·hive·hadoop·信息可视化·kafka·开源·hbase
二进制_博客4 天前
使用datax将mysql数据抽取到hive分区表无数据
数据库·hive·mysql