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)
上一篇 2022年1月26日 下午6:00
下一篇 2022年1月26日 下午7:00


相关推荐

  • 脉冲激光测距机原理「建议收藏」

    脉冲激光测距机原理「建议收藏」激光测距设计:大致流程:1,基本原理和关键:激光脉冲测距与雷达测距在原理上是完全相同的。在测距点激光发射机向被测目标发射激光脉冲,光脉冲穿过大气到达目标,其中一小部分激光经目标反射后返回测距点,并被测距机上的探测系统接收。测出从激光发射时刻到反射光被接收时刻之间的时间间隔t,根据已知光速,公式:S=Ct/2(S距离;C激光空气中速度;t发射和接收回波的时间差。激光测距方案和关键…

    2022年5月5日
    70
  • 2021win7激活码-激活码分享

    (2021win7激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlMLZPB5EL5Q-eyJsaWNlbnNlSW…

    2022年3月21日
    63
  • Android 低功耗蓝牙开发

    Android 低功耗蓝牙开发初识低功耗蓝牙Android4.3(APILevel18)开始引入BluetoothLowEnergy(BLE,低功耗蓝牙)的核心功能并提供了相应的API,应用程序通过这些API扫描蓝牙设备、查询services、读写设备的characteristics(属性特征)等操作。AndroidBLE使用的蓝牙协议是GATT协议,有关该协议的详细内容可以参见蓝牙官方文…

    2022年6月18日
    74
  • python中变量名_Python中的变量命名规则

    python中变量名_Python中的变量命名规则Python 变量命名规则 1 要具有描述性 2 变量名只能是 数字 字母组成 不可以是空格或特殊字符 如 amp 等 3 不能是中文 4 不能以数字开头 5 保留字符是不能被使用 如下 and as assert break class continue def del elif else except exec

    2025年10月28日
    12
  • Matlab 归一化函数premnmx

    Matlab 归一化函数premnmx函数目的是把数据处理成 1 1 之间 算法是 如 a 2 4 3 5 那么计算过程就是 2 2 2 5 2 1 1 2 4 2 5 2 1 1 3 0 6666 2 3 2 5 2 1 0 66662 5 2 5 2 1 1

    2026年3月19日
    2
  • 计算机操作系统-操作系统的定义

    计算机系统的层次结构 用户 应用程序 操作系统 纯硬件:CPU、RAM、ROM 其中,操作系统:从操作系统层往两侧看:负责管理协调硬件、软件等计算机资源的工作 从上往下看:为上层的应用程序和用户提供简单易用的服务 从下往上看:操作系统系统软件,而不是硬件定义OperatingSystem是指控制和管理整个计算机系统的硬件和软件资源,并合理地组…

    2022年4月13日
    49

发表回复

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

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