博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hive实现oracle的Minus函数
阅读量:4324 次
发布时间:2019-06-06

本文共 1336 字,大约阅读时间需要 4 分钟。

在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("NULL");

}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);

上面的sql会执行Minus的java程序,改程序语句中有循环。假设数据量非常大非常耗时间。job进度卡着不动。也能够使用hive自带的函数实现

insert overwrite table tmp_A_diff

select if(
        regexp_replace(
                  concat(                        
                        a.*
                        ),
                          " ","")
       =
        regexp_replace(
                 concat(
                        b.*
                        ),
                          " ","")
       ,NULL,b.id)
    from A a
             join 
         B b 
             on (a.id=b.id);

这样效率好些。

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

依据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)的数据。

转载于:https://www.cnblogs.com/yxwkf/p/5180451.html

你可能感兴趣的文章
openssl 升级
查看>>
ASP.NET MVC:通过 FileResult 向 浏览器 发送文件
查看>>
CVE-2010-2883Adobe Reader和Acrobat CoolType.dll栈缓冲区溢出漏洞分析
查看>>
使用正确的姿势跨域
查看>>
AccountManager教程
查看>>
Android学习笔记(十一)——从意图返回结果
查看>>
算法导论笔记(四)算法分析常用符号
查看>>
ultraedit激活
查看>>
总结(6)--- python基础知识点小结(细全)
查看>>
亿级曝光品牌视频的幕后设定
查看>>
ARPA
查看>>
JSP开发模式
查看>>
我的Android进阶之旅------&gt;Android嵌入图像InsetDrawable的使用方法
查看>>
Detours信息泄漏漏洞
查看>>
win32使用拖放文件
查看>>
Android 动态显示和隐藏软键盘
查看>>
raid5什么意思?怎样做raid5?raid5 几块硬盘?
查看>>
【转】how can i build fast
查看>>
null?对象?异常?到底应该如何返回错误信息
查看>>
django登录验证码操作
查看>>