大数据环境中,根据一张表(idList)的数据去修改另一张表的数据(id_label),有没有比较高效的方法?

发布于 2021-12-03 00:41:59 字数 463 浏览 725 评论 2

现在有一个类似的需求,在cloudera环境中,是根据一个表的数据去更新另一个表的对应的行的某个字段。

如在hive中有:

表A(字段有一个,为id),对应数据为(1,2);

表B(字段有两个,分别为 id:label),对应数据为(1:N,2:N,3:N,4:N);

现在根据需求,需要将表B中id在表A中的数据更新。

更新后表B数据应为(1:Y,2:Y,3N,4:N)

现在已经有的实现是在hive中直接通过sql做修改,但是效率很低,想问下这类问题在大数据环境中有没有更好的解决方法(如通过其他工具,现在考虑将修改的操作移回ORACLE数据库做处理),或者在hive是否有方法能对这个更新操作的效率做优化。

现在在hive的sql为update A set label ='Y' where A.id in (select id from B);

希望各位大大提供下思路,谢谢了

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

晚风撩人 2021-12-07 10:42:18

这个问题已经解决了,最后没有在hive数据做更新操作,因为过于低效了,而且也不符合hive做数据仓库(数据只进不出的原则)。我这边是把单表更新操作变成多表关联出当次结果,然后和上次结果比较,取差异的部分保存,最后通过ETL把结果回传到数据使用方。

静谧 2021-12-06 01:38:42

我也是刚入大数据没多久,小白一枚,抛个砖:

1、建立一个内存数据库,建立一张表C(两字段,对应B的id:label)<读写快>

2、每次A表中的id字段有更新,就从B表中查:select id,label from B where A.id = B.id

3、将B表查询到的数据写到C表中(因为是内存数据库,读写都比较快):insert into C (select id,label from B where A.id = B.id)<减少索引,降低搜索范围,提高搜索速度>

4、每次需要根据A表中的id,修改B表中的label字段时,先直接去修改C表中的label字段(不需要用hive 里的SQL),update C set label ='Y' where C.id in (select id from A),<查询label数据和返回结果都可以通过查表C得到>

5、定时更新表C的数据到表B<数据一致性>

总体思路就是,既然Hive要启用MR,一次更改效率低,那就把这个步骤拆开,把能快速执行/查找的步骤的提取出来并作出快速反馈,剩下的交给后台慢慢做。

缺点就是,内存数据库对内存要求比较高、数据通信问题、数据一致性问题。如果这些再业务上可以忍受的话,只是要求更新数据的时候反馈快一点,我大概能想到的思路就是这个也不知道行不行==

至于Hive SQL调优(我觉得你这句SQL已经很好了),表格优化什么的,望大神偶尔看到能指点一二,本人真的小白一枚,胡乱想到的,望轻喷

 

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文