当前位置: 首页 > news >正文

hive中2种常用的join方式

在最近的项目代码review中,发现之前代码小表关联大表的业务,小表经过过滤后,数据只有400多条,而大表有1600万条,之前的逻辑是使用的是小表 join 大表,运行时间1小时12分钟;经过优化后,使用了map join的方式,将小表放到内存中,运行时间7分钟。
借此机会回顾下hive中2种常用的join方式:Map Join、Reduce Join(也叫Common Join)
应对场景:

  • Map Join:适用于小表关联大表

  • Reduce Join:适用于大表关联大表

Map Join

Map Join通常用于一个很小的表和一个很大的表关联,将小表放入内存中,具体小表有多小,由参数hive.mapjoin.smalltable.filesize来决定,默认值为 25M,满足条件的Hive在执行时会自动转化为Map Join,或者使用
/*+ mapjoin(table) */执行 MapJoin

在这里插入图片描述

从上图中,我们可以看到小表b转成成一个HashTable的数据结构,并写入本地文件,之后加载到了distribute cache中,然后下面的task b就不需要reduce,直接输出结果。

示例:

select /*+ MAPJOIN(time_dim) */ count(1) from
store_sales join time_dim on (ss_sold_time_sk = t_time_sk)

Reduce Join

Reduce Join分为三个阶段,即map阶段,shuffle阶段,reduce阶段

在这里插入图片描述

  1. map阶段:
    读取表,将原始数据解析成hive内部的数据结构;执行查询中可在map阶段执行的操作,如where条件,select、简单的表达式计算,这些操作成为map-side操作,可减少传递给shuffle阶段的数据量,提高查询效率等;生成键值对,方便后续shuffle阶段根据key进行分组和排序。

  2. shuffle阶段:
    负责将map阶段的数据分区(partitioning)、排序(sorting)、分组(grouping),确保相同key的数据被发送到同一个Reduce任务进行处理。确保数据在map和reduce之间的正确分配和有序传递,是整个查询执行过程中最复杂且资源消耗最大的阶段
    reduce阶段:

  3. reduce阶段
    负责接收shuffle阶段的数据,将数据聚合、汇总和最终结果生成。从shuffle阶段接收具有相同Key的键值对集合,然后对Value聚合,最后写入HDFS。

SMB Join

  • Sort Merge Bucket Map Join(SMB Join) 适用于大表与大表之间的 Join,但前提是表已经按照 Join Key 进行了排序和分桶。

  • 原理:利用预处理(排序+分桶)的特性,在 Map 阶段直接完成 Join,避免 Shuffle 和 Reduce 开销,大幅提升查询性能。

  • 适用场景:数据仓库中的大表关联查询,尤其是已经预处理(排序+分桶)的表。

在这里插入图片描述

参考连接:

https://www.cnblogs.com/raymoc/p/5323824.html

https://blog.csdn.net/weixin_44320890/article/details/114702855

http://www.lryc.cn/news/579890.html

相关文章:

  • 基于 PyTorch 的猫狗图像分类实战
  • 【HarmonyOS Next之旅】DevEco Studio使用指南(四十) -> 灵活定制编译选项
  • 判断文件是否有硬链接
  • 类图+案例+代码详解:软件设计模式----单例模式
  • 【基础算法】贪心 (二) :推公式
  • PHP:从入门到进阶的全面指南
  • SRE - - PV、UV、VV、IP详解及区别
  • Ubuntu安装ClickHouse
  • 基于探索C++特殊容器类型:容器适配器+底层实现原理
  • 设计模式之代理模式--数据库查询代理和调用日志记录
  • 【C++复习2】内存篇
  • 计算机网络笔记(不全)
  • linux系统安全
  • Rovo Dev CLI Windows 安装与使用指南
  • Word和Excel批量转PDF新方法,操作简单
  • Selenium 安装使用教程
  • Java SE线程的创建
  • 怎么处理[TOO_MANY_REQUESTS/12/disk usage exceeded flood-stage watermark
  • 通道密度与安全性的突破:SiLM5768LCG-DG 六通道互锁隔离器如何重构高可靠系统?
  • Unity HDRP + Azure IoT 的 Python 后端实现与集成方案
  • 使用assembly解决jar包超大,实现依赖包、前端资源外置部署
  • linux 系统已经部署并正常提供服务的docker存储目录迁移
  • 【Prometheus 】通过 Pushgateway 上报指标数据
  • 每天一个前端小知识 Day 21 - 浏览器兼容性与 Polyfill 策略
  • AI+Web3:从Web2到Web3的范式革命与深度技术实践
  • 开源项目XYZ.ESB:数据库到数据库(DB->DB)集成
  • lsblk 显示磁盘(如 /dev/sda)已变大,但分区(如 /dev/sda2)未变,则需要手动调整
  • 微服务架构的演进:迈向云原生
  • 【C++】访问者模式中的双重分派机制详解
  • 【效率提升教程】飞书自动化上传图片和文字