2014-01-06 35 views
1

我有一个HIVE分区表,并且在将记录插入它之前,我需要查找记录是否已经存在。查找在插入之前HIVE表中是否已存在记录

例子。

Insert into table employee partition (day, location) select distinct name, number, 
date,aud_date, day, location from tableB. 

如果我试图从tableB插入的记录已经存在于雇员表中,它应该绕过或将其写入另一个表中。我需要检查员工表中是否已经存在的列是姓名,号码,日期,日期,地点。我不想检查aud_date,因为它会有所不同。

回答

2

假设“数量”的列是“非空”列(选择另外一个检查null如果这不是这种情况:

(注:加入的“其中日期> =”内嵌视图从OP的后续请求)

from (
select distinct e.number as e_number, B.name, B.number, b.date, B.aud_date, 
    B.day, B.location 
from tableB B left outer join 
    (select * from employee where date >= <blah>) e 
    on e.name=B.name and e.number = e.number 
    and e.date = B.date and e.day=B.day and e.location=B.location 
    where e.number is null 
) j 
insert overwrite into table employee e 
select j.name, j.number, j.date, j.aud_date, j.day, j.location 

要回答这个问题:“为什么是e.number是空的条件有”:左外连接,保证从第一个表中的所有值都包括在结果中,那么什么发生在第二个表中没有值的情况下:在这种情况下,第二个表中的所有列都会报告为null。

所以在上面,我们正在为第二个表项丢失的情况精确搜索的情况下 - 因而我们:

  • 选择从表中的两永不空(又名NOT NULL)列之一。所以:是一个永远在场的专栏?如果不是,则请选择另一个
  • 指定条件“table1-alias”。“table1-never-null-column”= null。这意味着该记录实际上不存在于连接条件中 - 因此我们发现只存在于表1中的记录。
+0

感谢您的帮助......请允许我告诉我为什么您要检查e。数字是NULL? – user3072054

+0

当然,我已经更新了答案,试图解释。 – javadba

+0

非常感谢你的清晰解释..更重要的是,如果我将表员工按日期分区,我不想在LEFT OUTER JOIN期间扫描整个分区。相反,我想根据tableB中的日期只扫描特定的分区(员工表)。是否有可能??? ..我们有一个大的表'n'分区数..如果我扫描通过所有这将需要大量的时间和影响性能.. – user3072054

相关问题