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

hive on tez如果是2个大表union会写几次临时文件到hdfs目录,数据量如何计算

如果是2个大表union会写几次临时文件到hdfs目录,数据量如何计算

在Hive on Tez中,两个大表执行UNION操作时,临时文件的写入次数和数据量,取决于UNION的类型(UNION ALL还是UNION去重)以及执行计划的Stage划分。以下分场景详细说明:

一、临时文件写入次数:与Stage数量直接相关

Tez会将UNION操作解析为多个Stage(计算阶段),每个Stage的输出都会写入HDFS临时目录(作为下一个Stage的输入)。因此,临时文件的“写入次数”等价于参与计算的Stage数量

1. 场景1:UNION ALL(不去重,仅合并)

UNION ALL仅需将两个表的结果“直接拼接”,执行计划通常包含3个Stage:

  • Stage 1:扫描并处理第一个表(如过滤、字段转换等,若无需处理则仅扫描),输出结果写入临时目录;
  • Stage 2:扫描并处理第二个表,输出结果写入临时目录;
  • Stage 3:合并Stage 1和Stage 2的临时结果(无需去重),输出最终合并结果到临时目录,最后通过原子操作写入目标表。

临时文件写入次数:3次(每个Stage各写1次)。

2. 场景2:UNION(自动去重,等价于UNION DISTINCT

UNION需要对两个表的合并结果去重,执行计划比UNION ALL多一个“去重Stage”,共4个Stage:

  • Stage 1:处理第一个表,输出临时文件;
  • Stage 2:处理第二个表,输出临时文件;
  • Stage 3:合并Stage 1和Stage 2的结果(此时数据可能有重复),输出到临时目录;
  • Stage 4:对Stage 3的结果执行去重(通常通过Reduce阶段的DISTINCT操作),输出去重后的结果到临时目录,最后写入目标表。

临时文件写入次数:4次(每个Stage各写1次)。

二、临时文件的数据量计算

临时文件的数据量取决于每个Stage的输出数据量,受原始表大小、处理逻辑(如过滤、转换)、数据格式(压缩与否)影响。以下为简化计算(假设无过滤/转换,默认压缩格式如ORC):

1. 场景1:UNION ALL

  • Stage 1临时文件:约等于第一个表的实际存储量(记为A,如100GB);
  • Stage 2临时文件:约等于第二个表的实际存储量(记为B,如200GB);
  • Stage 3临时文件:约等于A + B(合并后无去重,300GB)。

总临时数据量A + B + (A + B) = 2*(A + B)(3次写入的总和)。

2. 场景2:UNION(去重)

  • Stage 1临时文件A
  • Stage 2临时文件B
  • Stage 3临时文件A + B(合并后未去重);
  • Stage 4临时文件:约等于A + B - CC为重复数据量,假设重复50GB,则为250GB)。

总临时数据量A + B + (A + B) + (A + B - C) = 3*(A + B) - C(4次写入的总和)。

三、关键影响因素

  1. 数据压缩:若启用ORC/Parquet等压缩格式,临时文件实际存储量会比原始文本小3-5倍(需按压缩后大小计算);
  2. 处理逻辑:若UNION前有WHERE过滤或字段裁剪,Stage 1/2的输出量会小于原始表大小;
  3. 分桶/分区:若表是分桶或分区表,且UNION仅涉及部分分区,临时文件量会按实际涉及的分区数据计算;
  4. 重复数据比例UNION去重时,重复数据越多(C越大),Stage 4的输出量越小,总临时数据量越少。

总结

  • UNION ALL:3次临时文件写入,总数据量约2*(A + B)
  • UNION(去重):4次临时文件写入,总数据量约3*(A + B) - C
  • 实际数据量需结合压缩、过滤、重复率等因素调整,核心是“每个Stage的输出都会产生临时文件”。
http://www.xdnf.cn/news/19115.html

相关文章:

  • 密码管理中
  • 水果目标检测[2]:ALAD-YOLO:一种轻便、精确的苹果叶病检测仪
  • 学习Python中Selenium模块的基本用法(7:元素操作-1)
  • 【golang长途旅行第33站】常量------补充知识点
  • golang 12 package 和 module
  • Docker 入门指南:从基础概念到常见命令及高级工具详解
  • C++:知识点小结
  • vue2 watch 的使用
  • 从 WPF 到 Avalonia 的迁移系列实战篇1:依赖属性的异同点与迁移技巧
  • LangChain4j入门一:LangChain4j简介及核心概念
  • Python计算点云的欧式、马氏、最近邻、平均、倒角距离(Chamfer Distance)
  • 嵌入式C语言进阶:高效数学运算的艺术与实战
  • MySQL 8 与 PostgreSQL 17 对比分析及迁移指南
  • 【网络】网络基础概念
  • HarmonyOS安全开发实战:一套好用的数据加密方案
  • mysql mvcc机制详解
  • Java全栈开发面试实战:从基础到微服务架构的深度解析
  • IntelliJ IDEA Debug 模式功能指南
  • 替身演员的艺术:pytest-mock 从入门到飙戏
  • 寻找AI——初识墨刀AI
  • 极海发布APM32F425/427系列高性能MCU:助力工业应用升级
  • Ansible模块实战,操作技巧
  • 【C#】获取不重复的编码(递增,非GUID)
  • 怎么理解API?
  • R-Zero:通过自博弈机制让大语言模型无需外部数据实现自我进化训练
  • LeetCode-238除自身以外数组的乘积
  • 大脑的藏宝图——神经科学如何为自然语言处理(NLP)的深度语义理解绘制新航线
  • PowerShell下vim编辑文件时产生的额外文件
  • 网站防爆破安全策略分析
  • KingBase数据库迁移利器:KDTS工具 MySQL数据迁移到KingbaseES实战