Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hive 在插入配置单元表之前,先查找该记录是否已存在_Hive - Fatal编程技术网

Hive 在插入配置单元表之前,先查找该记录是否已存在

Hive 在插入配置单元表之前,先查找该记录是否已存在,hive,Hive,我有一个配置单元分区表,在向其中插入记录之前,我需要查找记录是否已经存在 例如 Insert into table employee partition (day, location) select distinct name, number, date,aud_date, day, location from tableB. 如果我试图从tableB插入的记录已经存在于employee表中,它应该绕过或写入另一个表。我需要检查employee表中是否已经存在的列是name、number、da

我有一个配置单元分区表,在向其中插入记录之前,我需要查找记录是否已经存在

例如

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

如果我试图从tableB插入的记录已经存在于employee表中,它应该绕过或写入另一个表。我需要检查employee表中是否已经存在的列是name、number、date、day和location。我不想检查aud_date,因为它将不同。

假设数字列为非空列,请选择另一列检查空值,如果不是这样:

注意:从OP的后续请求中添加了where date>=内联视图

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

因此,在上述情况下,我们正在精确搜索第二个表项丢失的情况,因此我们:

从表2中选择一个永不为空的列。那么:数字是一个始终存在的列吗?如果没有,请选择另一个 指定条件table1-alias.table1-never-null-column=null。这意味着记录实际上不存在于连接条件中,因此我们发现记录只存在于表1中。
假设number列为not null列,如果不是这种情况,请选择另一列检查null:

注意:从OP的后续请求中添加了where date>=内联视图

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

因此,在上述情况下,我们正在精确搜索第二个表项丢失的情况,因此我们:

从表2中选择一个永不为空的列。那么:数字是一个始终存在的列吗?如果没有,请选择另一个 指定条件table1-alias.table1-never-null-column=null。这意味着记录实际上不存在于连接条件中,因此我们发现记录只存在于表1中。
谢谢你的帮助。你能告诉我为什么要检查e.number是否为空吗?非常感谢你的明确解释。还有一件事,如果我让表employee按日期分区,我不想在左外部联接期间扫描整个分区。相反,我只想根据tableB中的日期扫描employee表的特定分区。有可能吗???。我们有一个包含“n”个分区的大表。如果我扫描所有分区,这将花费大量时间并影响性能。您需要将左外连接employee e替换为类似左外连接选择*from employee,其中日期>=e。顺便说一句,除了接受,你还可以投票支持我的答案。我还更新了我的答案非常感谢..我需要至少15个声誉来“提升投票权”,而我现在只有7个..我是这个stackoverflow的新手..在日期部分,我需要表B中的日期,而不是硬编码。我在日期上使用了一个左半联接,效果很好。非常感谢你在这方面的帮助。谢谢你的帮助。你能告诉我为什么要检查e.number是否为空吗?非常感谢你的清楚解释。还有一件事,如果我让表employee按日期分区,我不想在左外部联接期间扫描整个分区。相反,我只想根据tableB中的日期扫描employee表的特定分区。有可能吗???。我们有一个包含“n”个分区的大表。如果我扫描所有分区,这将花费大量时间并影响性能。您需要将左外连接employee e替换为类似左外连接选择*from employee,其中日期>=e。顺便说一句,除了接受,你还可以投票支持我的答案。我还更新了我的答案非常感谢..我需要至少15个声誉来“升级投票”,而我现在只有7个..我是这个stackoverflow的新手..在日期部分,我需要表B中的日期,而不是硬编码..我在日期上使用了左半连接,效果很好..非常感谢你在这方面的帮助。。