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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 《这是全网最硬核redis总结,谁赞成,谁反对?》六万字大合集

    后端需要知道的关于redis的事,基本都在这里了。此文后续会改为粉丝可见,所以喜欢的请提前关注。你的点赞和评论是我创作的最大动力,谢谢。《三天给你聊清楚redis》第1天先唠唠redis是个啥(18629字)一、入门Redis是一款基于键值对的NoSQL数据库,它的值支持多种数据结构:字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sortedsets)等。•Redis将所有的数据都存放在内存中,所以它的读写性能十分惊人,.

    2022年4月9日
    39
  • 高德地图自定义样式「建议收藏」

    高德地图自定义样式「建议收藏」高德地图里带有几个可选的样式(https://lbs.amap.com/api/javascript-api/guide/map/map-style/),如下图:唯一一个比较贴合我们公司页面色系的就

    2022年8月6日
    18
  • NC65 自由报表开发「建议收藏」

    NC65 自由报表开发「建议收藏」动态建模平台—->报表平台如果找不到?则登录账套管理员分配集团管理员的权限可参考下面链接https://blog.csdn.net/qq_19004705/article/details/119889910概述自由报表:是可利用报表分析工具设计出固定格式的、具有强大分析功能的分析型报表,可对报表数据进行各种自由分析。提供对数据集的复杂分析类设计功能,得到可适应企业决策人员使用的分析型报表及报表数据;同时也提供对已存在业务系统数据、采集报表数据,通过数据集进行随意组合查..

    2022年8月30日
    0
  • Java面向对象三大特征的理解

    Java面向对象三大特征的理解面向对象三大特征的理解初始理解封装继承多态初始理解其实这些知识很早就有接触,而且一些概念也牢记于心了。自己叙述面向对象的特征会是这样的:面向对象的三大特征是封装、继承和多态。封装是对代码的封装以实现迪内聚高耦合的设计,使代码更安全且具有良好的扩展性。继承是父类产生子类的过程,子类可以使用父类的非私有的属性和方法。多态是一个对象在不同时刻可以表现出不同状态的现象。外加Animal和Cat的例子。这一段时间敲了不少的Java代码,在敲代码的过程中想了无数次的面向对象这几个概念,对他们有了更深的了解,在这

    2022年7月15日
    10
  • leetcode-19删除链表的倒数第 N 个结点

    leetcode-19删除链表的倒数第 N 个结点原题链接给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。进阶:你能尝试使用一趟扫描实现吗?示例 1:输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]示例 2:输入:head = [1], n = 1输出:[]示例 3:输入:head = [1,2], n = 1输出:[1]提示:链表中结点的数目为 sz1 <= sz <= 300 <= Node.val <= 1001 <= n <= s

    2022年8月9日
    3
  • 对成绩进行排序c语言_c语言对学生成绩进行排序

    对成绩进行排序c语言_c语言对学生成绩进行排序解题思路:注意事项:注意姓名字符串的长度要大于8,因为这个调了很多次参考代码:#include#include#includeusingnamespacestd;structstudent{intnumber;charname[9];intscore;}buf[100000];boolcmp1(studenta,studentb){returna.number}boolcm…

    2022年9月25日
    0

发表回复

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

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