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

Hive实现oracle的Minus函数

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

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

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

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

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

insert overwrite table tmp_A partition(name=’A_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 A=“”;

String B=“”;

public Text evaluate(String… strs){

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

A=A+strs[i];

}

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

B=B+strs[i];

}

if(A.replace(” “, “”).equals(B.replace(” “, “”))){

return new Text(“NULL”);

}else{

return new Text(strs[0].replace(” “, “”));

}

}

相应的查询例如以下:

insert overwrite table tmp_A_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 A)minus (select * from B)的数据。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116059.html原文链接:https://javaforall.net

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

相关推荐

  • [行为识别论文详解]TSN(Temporal Segment Networks)[通俗易懂]

    [行为识别论文详解]TSN(Temporal Segment Networks)[通俗易懂]摘要本文旨在设计有效的卷积网络体系结构用于视频中的动作识别,并在有限的训练样本下进行模型学习。TSN基于two-stream方法构建。论文主要贡献:提出了TSN(TemporalSegmentNetworks),基于长范围时间结构(long-rangetemporalstructure)建模,结合了稀疏时间采样策略(sparsetemporalsamplingstrat…

    2022年6月21日
  • js判断字符串是否为空格_替换字符串c++

    js判断字符串是否为空格_替换字符串c++//判断字符串是否为空functionisNull(variable){if(variable!==null||variable!==undefined||variable!==”){ if(variable.replace(/(^s*)|(s*$)/g,””).length>0){returnfalse} }returntrue;

    2022年10月24日
  • 2021必看!java电子书合集,值得收藏![通俗易懂]

    2021必看!java电子书合集,值得收藏![通俗易懂]正文作为后端开发,日常操作数据库最常用的是写操作和读操作。读操作我们下边会讲,这个分类里我们主要来看看写操作时为什么会导致SQL变慢。刷脏页脏页的定义是这样的:内存数据页和磁盘数据页不一致时,那么称这个内存数据页为脏页。那为什么会出现脏页,刷脏页又怎么会导致SQL变慢呢?那就需要我们来看看写操作时的流程是什么样的。对于一条写操作的SQL来说,执行的过程中涉及到写日志,内存及同步磁盘这几种情况。这里要提到一个日志文件,那就是redolog,位于存储引擎层,用来存储物理日志。在写操

    2022年7月9日
  • 下列python语句的输出结果是print_下列 Python语句的输出结果是「建议收藏」

    下列python语句的输出结果是print_下列 Python语句的输出结果是「建议收藏」【填空题】遍历输出文件所有行。f=open(“d:\\r2.txt”,”r”)whileTrue:str=print(str,end=”)ifnotstr:breakf.close()【填空题】Pyhon语句序列”s1=’redhat’;print(str.upper(s1))”的运行结果是?【单选题】下列语句中,()在Python中是非法的。【单选题】执…

    2022年10月31日
  • Java开源博客源码完整汇总(持续更新)

    Java开源博客源码完整汇总(持续更新)程序员需要拥有一个属于自己的独立博客网站。所以我从网站收集了一些好的Java开源博客系统。既然是属于开源,当然支持我们广大程序员二次开发了。其实搭建属于自己的技术博客网站很简单,只需要一个域名,一台服务器,然后进行网站备案(个人备案很简单)就可以拥有属于自己的博客网站了。程序员一定要及早的打造个人独立IP,拥有自己的独立博客,学会扩大自己的影响力。在公司,你能力最多影响公司的同事。但是在互联网,拥有自己的网站,你就可以影响千千万万的程序员和即将入行的新手程序员1.OneBlog一个简洁美观、功能.

    2022年7月8日
  • spark 入门_新手入门

    spark 入门_新手入门一Spark概述 111什么是Spark 2Spark特点 3Spark的用户和用途 二Spark集群安装 1集群角色 2机器准备 3下载Spark安装包 4配置SparkStandalone 5配置JobHistoryServerStandalone 6配置SparkHAStandalone 7配置SparkYarn …

    2022年10月24日

发表回复

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

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