### Hive SQL Left Join 数据缺失问题解析 #### 一、问题背景 在大数据处理场景中,Hive 是一种广泛使用的工具,用于对存储在 Hadoop 文件系统中的数据进行数据汇总、查询和分析。随着Hive版本的不断更新,部分用户在升级至Hive 3之后遇到了数据处理中的一个常见问题——在执行Left Join操作时出现数据缺失。 #### 二、问题复现 问题发生在如下的SQL语句中: ```sql SELECT a.* FROM ( SELECT n.* FROM dw.dwm_exhibition_base n INNER JOIN ( SELECT database_name, MAX(dt) AS dt FROM dw.dwm_exhibition_base WHERE database_name = 'fair' GROUP BY database_name ) m ON n.database_name = m.database_name AND n.dt = m.dt WHERE n.exh_name = '亚太洁净技术与设备展览会' ) a LEFT JOIN ( SELECT database_name, exh_id, exh_name, actor_exh_time, CONCAT(exh_id, '_', database_name, '_', exh_name, '_', actor_exh_time) AS exh_id_new, COUNT(*) AS actor_cnt FROM ( SELECT database_name, exh_id, exh_name, SUBSTR(actor_exh_time, 0, 10) AS actor_exh_time, actor_id, actor_name FROM dw.dwd_actor_exhibition WHERE exh_id IS NOT NULL AND exh_name IS NOT NULL AND actor_exh_time IS NOT NULL --AND exh_name = '亚太洁净技术与设备展览会' GROUP BY database_name, exh_id, exh_name, SUBSTR(actor_exh_time, 0, 10), actor_id, actor_name ) t GROUP BY database_name, exh_id, exh_name, actor_exh_time, CONCAT(exh_id, '_', database_name, '_', exh_name, '_', actor_exh_time) ) t2 ON a.exh_id = t2.exh_id_new WHERE t2.actor_cnt > 0 ``` #### 三、问题分析 问题的核心在于Hive 2 和 Hive 3 版本之间对于JOIN操作的实现方式存在差异。具体来说,这是由于不同版本的Hive在JOIN操作时采用了不同的Hash算法导致的。具体细节如下: 1. **Hive 2 vs Hive 3 的Hash算法差异**: - Hive 2 版本在JOIN操作时采用了一种特定的Hash算法来确保相同的数据能够正确地关联在一起。 - 升级到 Hive 3 后,新的版本改变了Hash算法,这导致在相同的JOIN操作中,原本应该被正确关联的数据因为Hash值的不同而未能成功匹配。 2. **Bucketing Version的影响**: - Bucketing Version 是Hive表的一个属性,用于控制如何对数据进行分区和分桶。 - Hive 3 默认的bucketing_version为2,而旧版Hive的bucketing_version为1。 - 这个属性的变化直接影响了数据的分桶方式,从而影响了JOIN操作的Hash算法选择。 3. **TEZ引擎的问题**: - 使用TEZ引擎执行Join操作时,可能会遇到数据丢失的情况。这是因为TEZ引擎在转换多个MapJoin为单个操作时,可能会限制输入数据的最大大小,从而导致数据的丢失。 #### 四、解决方案 针对上述问题,可以通过以下几种方式进行解决: 1. **调整bucketing_version**: - 通过查询当前表的bucketing_version属性,并将其调整为与旧版本一致的设置(例如设置为1)。 - 查询示例SQL如下: ```sql SELECT c.NAME AS DB_NAME, a.TBL_NAME, b.PARAM_KEY, b.PARAM_VALUE FROM TBLS a LEFT JOIN TABLE_PARAMS b ON a.TBL_ID = b.TBL_ID AND b.PARAM_KEY = 'bucketing_version' LEFT JOIN DBS c ON a.DB_ID = c.DB_ID WHERE b.TBL_ID IS NULL AND c.NAME = 'dw'; ``` 2. **优化TEZ参数配置**: - 调整TEZ引擎的相关参数,比如增大允许的输入数据大小等,以避免数据丢失的问题。 - 可以通过设置tez.mapjoin.thresholdsize-mb等参数来实现。 3. **使用兼容模式**: - 如果可能的话,可以尝试在Hive 3中启用兼容模式,使得其行为更加接近Hive 2的行为,从而减少因版本升级带来的兼容性问题。 通过上述方法,可以有效解决Hive 3版本中Left Join操作出现的数据缺失问题,确保数据分析的准确性。
- 粉丝: 734
- 资源: 76
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 新北师大版五年级数学(上册)期末总复习_知识点.doc
- 新视野大学英语(第三版)读写教程第三册第二单元课后练习答案.doc
- 学规懂规践规中新增双重预防体系试题(危化品)附含答案.doc
- 学生会生活部长申请书(选择多篇).doc
- 学生团体心理辅导活动记录.doc
- 医学统计学的试题和答案.doc
- 英语作文能加分的100个好句子.doc
- 学校扁平化管理模式.doc
- 有趣的一件事情[800字]作文.doc
- 幼儿园升旗仪式发言稿(选择多篇).doc
- 语文阅读理解解题技巧之若何概括文章的中心思想.doc
- 中考英语作文常用句式及高频话题汇编.doc
- 中考英语高频词汇汇总.doc
- 知识经济对会计的挑战和对策.doc
- 自学考试《教育统计和测量》.doc
- 中小学校校园安全知识竞赛试题.doc