2014-01-06 38 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

相關問題