2017-08-04 2 views
0

Die ACID-Eigenschaften in Hive erlauben löschen Zeilen aus einer Tabelle zu löschen, die folgende Syntax verwenden:Hive Reihe mit zusammengesetzten Primärschlüssel

DELETE FROM table 
WHERE id IN (SELECT id FROM raw_table) 

Aber was ist die beste Lösung Zeilen zu löschen, wenn die primary_key aus mehreren Spalten besteht ?

Ich habe folgendes versucht, mit einem VORHANDEN:

DELETE FROM table 
WHERE EXISTS (SELECT id1, id2 FROM raw_table 
       WHERE raw_table.id1 = table.id1 AND raw_table.id2 = table.id2) 

oder die folgende (alle Spalten verketten, nicht sicher, ob diese gültig ist):

DELETE FROM table 
WHERE CONCAT(id1, id2) IN (SELECT CONCAT(id1, id2) FROM raw_table) 

Haben Sie Tipps zum Thema Was ist die beste Lösung?

Antwort

0

Die Lösung, die exist verwendet, ist gültig. Auch Ihre Lösung Werte verketten ist gültig, aber abhängig von den Werten, die Sie finden können Sie Löschen von Daten werden könnten, die Sie nicht wollen, zum Beispiel

id1: 01 
id2: 1 

Sie Zeilen mit 011 zu löschen, aber es auch passen mit

id1: 0 
id2: 11 

was nicht erwartet wird. Ich würde vorschlagen, ein Trennzeichen zwischen den IDs hinzufügen.

DELETE FROM table 
WHERE CONCAT(id1, id2) IN (SELECT CONCAT(CONCAT(id1,"-"), id2) FROM raw_table) 

Beide Lösungen sollten nur 1 Job mit Mapper ausführen und Phase reduzieren, daher sollte der Ausführungsplan und Leistung nahezu die gleichen

Grüße sein!

+0

Vielen Dank für Ihre Antwort. Ich ging tatsächlich mit dem ersten Ansatz mit den EXISTS, glaubst du, es wird mehr Zeit kosten? –

+0

Ich bearbeite nur meine Antwort. – hlagos

Verwandte Themen