Hive-LEFT SEMI JOIN für 'NICHT VORHANDEN'

Ich habe zwei Tabellen mit einer einzigen Spalte Schlüssel an. Schlüssel in der Tabelle a sind Teilmenge aller Schlüssel in der Tabelle b. Ich muss wählen Sie Tasten aus der Tabelle b, die NICHT in der Tabelle ein.

Hier ist ein Zitat von Hive-Handbuch:
"LEFT SEMI JOIN implementiert die unkorrelierte IN/EXISTS-Unterabfrage Semantik in einer effizienten Art und Weise. Als von Hive 0.13 Sie die IN/NICHT IN/EXISTS/not EXISTS-Operatoren werden unterstützt die Verwendung von Unterabfragen so sind die meisten dieser Verknüpfungen müssen nicht manuell durchgeführt werden mehr. Die Beschränkungen der Verwendung von LEFT SEMI JOIN ist, dass die rechts-hand-Seite-Tabelle sollte nur verwiesen werden, die in den join-Bedingungen (ON-Klausel), aber nicht in WHERE - oder SELECT-Klauseln etc."

Verwenden Sie dieses Beispiel zur illustration:

    SELECT a.key, a.value FROM a WHERE a.key IN (SELECT b.key FROM B);

Entspricht

    SELECT a.key, a.val FROM a LEFT SEMI JOIN b ON (a.key = b.key);

Jedoch, was ich tun müssen, ist erste Beispiel mit 'NICHT;. Leider ist diese syntax wird nicht unterstützt Hive 0.13. Es ist nur zur Veranschaulichung:

    SELECT a.key, a.value FROM a WHERE a.key NOT IN (SELECT b.key FROM B);

Ich suchte diese site für Empfehlungen, und sah in diesem Beispiel:

    SELECT a.key FROM a LEFT OUTER JOIN b ON a.key = b.key WHERE b.key IS NULL;

Funktioniert es nicht wie erwartet. Wenn ich an einem.Schlüssel NICHT in der b-und a -.Schlüssel IN b, habe ich nicht das original einer auf diese Weise. Vielleicht ist da diese Abfrage nicht tun, der trick, Hinweis: Fett gedruckter text - b.Schlüssel sollten Sie nicht erscheinen, in DENEN.

Was sollte ich dann tun? Jeden anderen trick? Danke!

P. S. ich kann nicht teilen, irgendwelche echten Daten; es ist ein ziemlich einfaches Beispiel, wo die Tasten sind alle enthalten in b und a eine Teilmenge von b.

  • In allen Datenbanken, die ich kenne, die not in und left join mit is null funktionell äquivalent sind, vorausgesetzt, dass die Vergleichswerte nicht NULL.
  • Danke, aber ich sehe nicht, wie das helfen kann. Was ist die Lösung Abfrage?
  • . . Die Letzte Abfrage sollte funktional äquivalent zu der not in version (vorausgesetzt, es ist kein NULL Werte). Vielleicht können Sie Bearbeiten Ihre Frage und erklären, wie es nicht zu tun, was Sie erwarten. Ich verstehe, wie die Abfragen funktionieren. Ich verstehe nicht, was Sie erwarten.
  • Ich erklärte, wie es funktioniert nicht auf große Datensätze, obwohl auf einfachen Daten-es funktioniert einwandfrei. Die Frage war: "gibt es irgendeinen anderen Weg, das zu tun, was ich brauche?"
  • Hier ist eine alternative Lösung. WÄHLEN Sie Schlüssel AUS (WÄHLEN Sie ein.Schlüssel, b1.Markierung VON (SELECT-key, COUNT(2) ALS marker VON b GROUP BY-Schlüssel) b1 RIGHT OUTER JOIN-eine AUF b1.key = ein.Schlüssel) t, WO die Markierung IST NULL;
  • stackoverflow.com/questions/27854649/...

InformationsquelleAutor mel | 2014-07-30
Schreibe einen Kommentar