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
undleft join
mitis null
funktionell äquivalent sind, vorausgesetzt, dass die Vergleichswerte nichtNULL
. - 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 keinNULL
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/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie wollen Ergebnisse aus Tabelle b, vielleicht können Sie Folgendes tun stattdessen?
Die Antwort auf Ihre Frage sein sollte
Bedeutet dies, bringen Sie alle Schlüssel von a, unabhängig davon, ob es eine übereinstimmung gibt in b oder nicht. Die, wo die Ursache filtert jene Datensätze, die nicht in b.
Oder Sie können versuchen,
Ich versuchte left semi join-IN-Funktion in die cdh 5.7.0 vorhanden mit spark 1.6 version.
Semi left join gibt falsche Ergebnisse, die nicht ähnlich ist, IN Funktion in sub-Abfragen.