Hive分桶机制应用

Hive分桶机制应用

业务背景:

  1. 数据提供方的数据频率不固定,很多时候,N天才会推一次,多天的业务数据,会集中到某一个分区中
  2. 由于分布不均匀,查询的时候,也就需要不固定时间范围的查询。
  3. 按照业务需求,需要关联维表,回填一些信息。

解决办法:

  1. 使用动态分区的方式,按业务时间,重新将数据写入新的表。
  2. 新表设计时候引入分桶策略,方便后期查询。

新表设计:

sql 复制代码
-- 数据表
create table if not exists new_box(
	capture_time bigint comment '采集时间戳',
    uid string comment '用户ID',
    tags string ,
    ......
)partitioned by (dt string comment '日期分区')
CLUSTERED BY (uuid) INTO 32 BUCKETS;

-- 用户标签表
create table if not exists user_tags(
	uid string ,
    tags string
)CLUSTERED BY (uuid) INTO 32 BUCKETS;

动态分区

sql 复制代码
SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;
SET hive.execution.engine=tez;
SET hive.merge.tezfiles=true;
SET hive.merge.size.per.task=268435456; -- 256MB
SET hive.merge.smallfiles.avgsize=16777216; -- 16MB

INSERT INTO TABLE new_box PARTITION (dt)
SELECT
    t1.capture_time,
    t1.uid,
    t2.tags
    ...
    date_format(capture_time, 'yyyy-MM-dd') AS dt
FROM src_data t1
left join
user_tags t2 
on t1.uid=t2.uid
DISTRIBUTE BY
    hash(uid) % 64,
    dt;

如何设计分桶:

分桶设计的4条核心原则:

  • 分桶是为了join、去重、抽样,不是为了分区
  • 一个表只允许一个分桶键(clustered by 只能是一个字段)
  • 分桶键必须是 JOIN/Group By/Distinct 的高频字段
  • 分桶数=数据规模 / 单文件理想大小。

分桶设计的标准流程(5步法)

1: 确定分桶键

✅ 优先候选

场景 分桶键
事实表 JOIN 维表 外键(uuid / user_id)
明细表去重 主键
用户行为分析 user_id
订单表 order_id

❌ 绝对不要

  • 时间戳
  • 经纬度
  • 高基数 + 无意义字段

2:判断是否需要分桶

问自己 3 个问题:

1️⃣ 是否会 频繁 JOIN / 去重 / 抽样

2️⃣ 数据量是否 ≥ 100GB?

3️⃣ 是否已经有分区?

✅ 满足 2 个以上 → 必须分桶

3:计算bucket数

经验公式: bucket数 ≈ 表数据量 / 单 bucket 理想大小

✅ 推荐单 bucket 大小

场景 推荐
离线批处理 200--400MB
交互查询 100--200MB
日志表 256MB

4.表结构模板

sql 复制代码
CREATE TABLE xxx (
    ...
)
PARTITIONED BY (dt STRING)
CLUSTERED BY (bucket_key) INTO 32 BUCKETS
STORED AS PARQUET;
  • 分区不等于分桶
  • 不要把时间放进分桶

5.写入时预防小文件

sql 复制代码
INSERT INTO TABLE xxx PARTITION (dt)
SELECT ...
FROM source
DISTRIBUTE BY
    hash(bucket_key) % 32,
    dt;

备注:

  • 控制文件数
  • 不影响 bucket 映射
  • 与 CLUSTERED BY 逻辑一致

验证是否合理

bucket分布检查:

sql 复制代码
SELECT hash(uuid) % 32 AS b, count(*) 
FROM table 
GROUP BY b;

结果:

  • 0-31连续
  • 行数差距< 20%

JOIN是否命中SMB

sql 复制代码
explain select ...

# SMB Join Operator

#(利用两张表的分桶信息,直接按 bucket 对齐 JOIN,避免 Shuffle)
相关推荐
知识分享小能手12 小时前
Hadoop学习教程,从入门到精通, MapReduce分布式计算框架 — 完整知识点与代码案例(4)
hadoop·学习·mapreduce
白日与明月15 小时前
Hive子查询中的ORDER BY陷阱:为什么排序“消失”了?
数据仓库·hive·hadoop
段一凡-华北理工大学16 小时前
工业领域的Hadoop架构学习~系列文章24:adoop工业应用总结与展望 - 技术路线图与最佳实践
大数据·人工智能·hadoop·分布式·学习·架构·高炉炼铁
段一凡-华北理工大学16 小时前
工业领域的Hadoop架构学习~系列文章23:物流行业Hadoop应用实践 - 智能物流的数字化引擎
大数据·人工智能·hadoop·分布式·学习·架构·高炉炼铁
奇点爆破XC2 天前
Hadoop大数据生态(Ambari管理)组件服务详解
大数据·hadoop·ambari
isNotNullX2 天前
企业数据中台建设,ETL工具选错了会踩哪些坑?
数据仓库·etl·原型模式
SelectDB技术团队2 天前
预约发布会|核心产品力首发,如何构建面向 Agent 时代的企业级数据引擎
数据库·数据仓库·人工智能·数据分析·可观测·apache doris·selectdb
段一凡-华北理工大学2 天前
工业领域的Hadoop架构学习~系列文章22:Hadoop生态展望 - 面向未来的技术演进
大数据·人工智能·hadoop·分布式·学习·架构·高炉炼铁
Nefu_lyh2 天前
【Hive】六、Hive 运算逻辑:数学 / 逻辑 / 条件 / 日期 / 字符串函数
数据仓库·hive·hadoop
ChaITSimpleLove2 天前
Etl.Net 2.2.0 项目深度分析
数据仓库·.net·etl·大数据处理·数据管道·数据处理引擎