码迷,mamicode.com
首页 > 数据库 > 详细

Hive实现oracle的Minus函数

时间:2014-10-09 03:10:47      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:style   color   io   ar   for   数据   sp   art   c   

在Oracle中minus运算的主要功能是: 在进行两个表格或者两个查询结果的时候,返回在第一个表格/查询结果中与第二个表格/查询结果不相同的记录。

结果不相同的记录包含两种情况:A,B 表中某一行的内容不同和A表中的数据在B表中不存在。总之返回的是A表的数据。

Hive中没有实现minus功能的函数,只好分步实现。

一、找出在A表中的数据在B表中不存在的数据

insert overwrite table tmp_A partition(name=‘_innot_B‘)

select 

                  a.*

from A a left outer join  B b on (a.id = b.id)  where b.id is NULL; 

二、找出在A表和B表都存在但内容不同的数据

UDF函数如下:

public class Minus extends UDF{

String ="";

String ="";

public Text evaluate(String... strs){

for(int i=0;i<strs.length/2;i++){

=+strs[i];

}

for(int i=strs.length/2;i<strs.length;i++){

=+strs[i];

}

if(.replace(" """).equals(.replace(" """))){

return new Text("");

}else{

return new Text(strs[0].replace(" """));

}

}

对应的查询如下:

insert overwrite table tmp__diff

select iminus(

                       a.*,b.*

     ) from A a join B b on (a.id=b.id);

tmp_A_diff存储的是A表和B表都存在但内容不同的数据的id和一些“”

根据id获得每行数据

insert overwrite table tmp_A partition(name="A_in_B")

select            a.*

from tmp_A_diff b join A a on (a.id=b.id);

现在tmp_A中分区A_innot_B和分区A_in_B的数据就是oracle中(select * from Aminus (select * from B)的数据。


Hive实现oracle的Minus函数

标签:style   color   io   ar   for   数据   sp   art   c   

原文地址:http://blog.csdn.net/yonghutwo/article/details/39897681

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!