Hive实现oracle的Minus函数

本文介绍如何在Hive中通过SQL查询及UDF函数实现Oracle中minus的功能,即找出两个表中不同或仅在一个表中存在的记录。文章详细展示了两步实现过程:首先找出A表中有而B表中没有的数据;其次找出两表中存在但内容不一致的数据。

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

1、什么是关系 关系模型 常见的关系模型有哪些?请举例说明 2、关系模型从存储结构分为哪三类?有什么区别?请举例说明 3、解释元数据(数据字典),数据元,数据项 4、关系代数得集合运算和关系运算符有哪些? 5、User、schema和database的区别,请用mysql和oracle举例说明 6、varchar和varchar2、char有什么区别,mysql最大长度 7、如何把包含null的字段填充为该字段的平均值 8、列举你所知道的分析函数和作用,分别举例说明,不能只包含排名函数 9、分析函数中窗口子句range和rows的区别分别是什么?举例说明 10、如何取每个学生最高成绩对应的课程编号、名称、学分,写出sql 11、查找id列不重复的数据,写出sql 12、有下列数据,如何取最新日期对应的一条 name score date A 60 202207 B 90 202208 A 80 202209 B 80 202206 结果为 A 80 202209 B 90 202208 13、写出sum(a+b)的结果 1 null 2 1 Null 2 14、Oracle如何取上个月对应天,写出sql 15、在进行数据逻辑集合比较的时候,ORACEL提高了方便的操作供我们选用。 包括union、intersec、minus请分别指出这几个操作的含义 16、count(1)和count(*)、count(字段)哪个效率高,为什么? 17、a表左关联b表且a表左关联c表,a表左关联b表且b表左关联c表,有什么区别?请举例说明 18、如何知道查询的结果集(海量数据查询,里边几层子查询),是不是正确的,请写出正确的排查思路 19、举例说明交叉连接、全连接和union all的区别,请问全连接是笛卡尔积吗?为什么? 20、Group by后面的字段和select后面的字段,在集合上是什么关系?请使用mysql和oracle举例说明 21、如何删除字符串左边和右边的空格字符,如何替换字符串任意一处的空格,请分别写出sql 22、一张学生表,有姓名、科目、成绩三个字段 A.求学生的平均成绩 B.求平均成绩的前三名,除了用row_number还有什么方法 C.求平均成绩最大的学生信息 25、从一个用户订单明细(一个用户多个订单,一个订单多个商品)统计出用户的数量,订单的数量、用户下单的数量、每个订单购买商品的数量,自己设计表格,插入数据,然 后进行统计,写出建表sql、插入数据和分析sql,分析sql有能力的最好只使用一条语句,可额外加分。
最新发布
06-17
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值