关于hive3多表leftjoin导致数据丢失问题及解决方案

这篇具有很好参考价值的文章主要介绍了关于hive3多表leftjoin导致数据丢失问题及解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近业务场景需要将一张大表通过name名字关联多个小表去获取他们的id,大表数据9000w,小表数据最大180w,最小30w,我以主表leftjoin的时候发现了数据丢失问题

代码如下 

select eid, concat_ws(',', hat_name1, hat_name2, hat_name3, hat_name4, hat_name5, hat_name6) as hat_name
from (select t1.eid,
             if(t1.name = t2.name, hat_name1, null)  as hat_name1,
             if(t1.name = t3.name, hat_name2, null)      as hat_name2,
             if(t1.name = t4.name, t4.hat_name, null) as hat_name3,
             if(t1.name = t5.name, hat_name4, null) as hat_name4,
             if(t1.name = t6.name, t6.hat_name, null) as hat_name5,      
            if(t1.eid = t7.eid, t7.hat_name, null) as hat_name6
      from temp_a t1
               left join temp_a t2 on t1.format_name = t2.name
               left join temp_b t3 on t1.credit_no = t3.code
               left join temp_c t4 on t1.format_name = t4.name
               left join temp_d t5 on t1.format_name = t5.name
               left join temp_e = t6.eid
               left join temp_f t7 on t1.eid = t7.eid) t;

结果显示数据我t7的数据由180w剩下9w,发生了严重的数据丢失,在别的表也有不同程度的丢失问题.

最后发现这个问题主要是hive3版本底层mr的缺陷,是由于 HIVE 2 与 HIVE 3 在 JOIN 操作时使用了不同的 Hash 算法,导致同样的值在关联时被不同的 Hash 算法映射成了不同的值,而这些不同的 Hash 值在进行关联时无法被相互匹配。最终导致本来该被关联在一起的数据由于 Hash 值得不同未能被关联在一起。而决定到底应用哪套 Hash 值算法则是根据 bucketing_version 的值来进行评判的。

特别地,在进行多表关联时,即使相同 bucketing_version 的 Hive 表,由于其关联的中间过程所产生的中间表,在源代码中 bucketing_version 值会被置为 -1,因此该中间表再与第三张乃至更多的表关联时会直接导致 Hash 算法的混乱计算。

因此,为了保障关联的数据准确性,必须要确保 bucketing_version 在进行多表关联或者多版本表关联时的稳定。即,保障 bucketing_version 的稳定性就是保证 Hive 3 数据关联时的准确性。

此外,HIVE 社区已经针对 bucketing_version 不稳定的问题进行了集中的问题汇总和修改建议指导。可以通过查看 JIRA: HIVE-21304 了解系统性的 bucketing_version 稳定性提高方法,此处不做过多赘述。此处引出之前看到文章:
https://blog.csdn.net/weixin_38070561/article/details/126895259

此外,除了上面通过源码的修改来解决之类问题,我也从sql上考虑解决该问题的可行性,如果多表leftjoin可能造成数据丢失,那我们是否可以尽量的少去关联它呢?

因为我的业务是为了获取主表的id,所以我采用了unionall的方法,将各个小表以临时表的方式unionall一起,然后跟主表left去获取他的id,这是我就从6表关联变成了1表关联,代码如下:
 

select eid, name, hat_name, hat_id
from (select eid, name, hat_name, hat_id
      from temp_a
      union all
      select eid, name, hat_name, hat_id
      from temp_b
      union all
      select eid, name, hat_name, hat_id
      from temp_c
      union all
      select '' as eid, name, hat_name, hat_id
      from temp_d
      union all
      select eid, name, hat_name, hat_id
      from temp_e
      union all
      select '' as eid, name, hat_name, hat_id
      from temp_f
     ) t1
group by eid, name, hat_name, hat_id

因为考虑数据安全,代码仅发表部分,大概就是这个意思,上面的数据插入临时表后与大表关联也可以有效防止数据丢失,当然这个办法只能说是治标不治本的办法,因为业务比较急才走的捷径,归根到底还是得从根源上解决问题文章来源地址https://www.toymoban.com/news/detail-557569.html

到了这里,关于关于hive3多表leftjoin导致数据丢失问题及解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • tapiui.dll文件丢失导致程序无法运行问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个tapiui.dll文件(挑选合适

    2024年03月14日
    浏览(16)
  • wlanui.dll文件丢失导致程序无法运行问题

    wlanui.dll文件丢失导致程序无法运行问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个wlanui.dll文件(挑选合适

    2024年02月02日
    浏览(18)
  • Digital.ocx文件丢失导致程序无法运行问题

    Digital.ocx文件丢失导致程序无法运行问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个Digital.ocx文件(挑选合适

    2024年03月18日
    浏览(16)
  • 连接服务器数据库出现问题:The driver has not received any packets from the server.(暴力解决,会导致数据丢失,因此需要有备份,慎用!!!)

    连接服务器数据库出现问题:The driver has not received any packets from the server.(暴力解决,会导致数据丢失,因此需要有备份,慎用!!!)

    遇到这个问题第二次了,特此记录一下。 问题出现背景:在云服务器上使用mysql数据库,写程序的时候连接得好好的,能各种查询数据,过了一段时间发现突然连不上了,报错: W/System.err: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure W/System.err:  W/System.e

    2024年02月10日
    浏览(10)
  • 【大数据Hive3.x数仓开发】窗口函数案例:连续N次登录的用户;级联累加求和;分组TopN

    【大数据Hive3.x数仓开发】窗口函数案例:连续N次登录的用户;级联累加求和;分组TopN

    对窗口函数的讲解part见:【大数据Hive3.x数仓开发】函数–窗口函数 自连接过滤实现 连续两天登陆的用户ID: 窗口函数lead()实现 功能:用于从当前数据中基于当前行的数据向后偏移取值 语法: lead(colName,N,defautValue) colName:取哪一列的值 N:向后偏移N行 defaultValue:如果取不到返回

    2023年04月17日
    浏览(17)
  • hive3升级

    1.备份hive2元数据库 2.导入到hive3对应的hive元数据表 3.更新hive_metastore数据表信息 3.1需要新增的表 序号 hive3 1 I_SCHEMA 2 MATERIALIZATION_REBUILD_LOCKS 3 METASTORE_DB_PROPERTIES 4 MIN_HISTORY_LEVEL 5 NEXT_WRITE_ID 6 REPL_TXN_MAP 7 RUNTIME_STATS 8 SCHEMA_VERSION 9 TXN_TO_WRITE_ID 10 WM_MAPPING 11 WM_POOL 12 WM_POOL_TO_TRIGGER 1

    2024年02月08日
    浏览(13)
  • Windows系统丢失msvcrt40.dll文件导致程序无法运行问题

    Windows系统丢失msvcrt40.dll文件导致程序无法运行问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个msvcrt40.dll文件(挑选合适

    2024年02月06日
    浏览(9)
  • Windows系统丢失msimg32.dll文件导致程序无法运行问题

    Windows系统丢失msimg32.dll文件导致程序无法运行问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个msimg32.dll文件(挑选合适

    2024年02月03日
    浏览(23)
  • Windows系统丢失netapi32.dll文件导致程序无法运行问题

    Windows系统丢失netapi32.dll文件导致程序无法运行问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个netapi32.dll文件(挑选合适

    2024年01月21日
    浏览(17)
  • Windows系统中丢失opengl32.dll文件导致程序无法运行问题

    Windows系统中丢失opengl32.dll文件导致程序无法运行问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个opengl32.dll文件(挑选合适

    2024年02月12日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包