Hive实现oracle的Minus函数[通俗易懂]

Hive实现oracle的Minus函数

大家好,又见面了,我是全栈君。

在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://javaforall.net/116059.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 利用PowerShell复制SQLServer账户的所有权限

    利用PowerShell复制SQLServer账户的所有权限

    2021年11月28日
    39
  • Pycharm连接并调用服务器「建议收藏」

    Pycharm连接并调用服务器「建议收藏」Pycharm可以与服务器建立连接,把相应的项目同步到服务器上,并且可以通过Pycharm直接使用服务器的解释器运行相应程序,实现Pycharm编程,服务器运行的效果。具体步骤如下:1.建立一个服务器连接Pycharm的“Tools”-》“Deployment”-》“Configuration”2.创建一个SFTP3.为该项目添加一个SSH解释器。因为前面已经添加好了服务器连接,所以这里直接选择已经设置好的就可以,如果没有已经设置好的,可以重新添加。配置好SSH之后,选择Next,设置本地项目

    2022年8月28日
    2
  • 如何在一个页面使多个setInterval函数正常运行

    如何在一个页面使多个setInterval函数正常运行varfirstInterval;varsecondInterval;functionfirstAlert(){if(firstInterval)clearInterval(firstI

    2022年7月2日
    27
  • pagecontext request session_pagecontent

    pagecontext request session_pagecontent ${pageContext.request.contextPath}是JSP取得绝对路径的方法,等价于&lt;%=request.getContextPath()%&gt; 。 也就是取出部署的应用程序名或者是当前的项目名称 比如我的项目名称是demo1在浏览器中输入为http://localhost:8080/demo1/a.jsp${pageContext.request.co…

    2025年12月14日
    6
  • 俄罗斯介入叙利亚始末_俄罗斯为什么不帮助利比亚

    俄罗斯介入叙利亚始末_俄罗斯为什么不帮助利比亚导读对于美国国土安全部禁止该国所有国家机构使用俄罗斯卡巴斯基实验室软件的做法,俄罗斯政府于9月14日提出批评。卡巴斯基实验室否认美国政府提出的所有指控,并表示愿意与美国国土安全部合作。俄罗斯总统新闻秘书德米特里·佩斯科夫9月14日对记者表…

    2022年8月20日
    29
  • RabbitMQ的优先级队列「建议收藏」

    RabbitMQ的优先级队列「建议收藏」优先级队列队列需要设置优先级队列,消息需要设置消息的优先级。消费者需要等待消息已经发送到队列中,然后对队列中的消息进行排序,最后再去消费。Map<String,Object>arguments=newHashMap<>();arguments.put(“x-max-priority”,10);//设置优先级队列channel.queueDeclare(QUEUE_NAME,false,false,fal

    2022年9月23日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号