大数据环境中,根据一张表(idList)的数据去修改另一张表的数据(id_label),有没有比较高效的方法?
现在有一个类似的需求,在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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这个问题已经解决了,最后没有在hive数据做更新操作,因为过于低效了,而且也不符合hive做数据仓库(数据只进不出的原则)。我这边是把单表更新操作变成多表关联出当次结果,然后和上次结果比较,取差异的部分保存,最后通过ETL把结果回传到数据使用方。
我也是刚入大数据没多久,小白一枚,抛个砖:
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已经很好了),表格优化什么的,望大神偶尔看到能指点一二,本人真的小白一枚,胡乱想到的,望轻喷