2016-04-26 3 views
0

Ich ziehe meine Haare aus versuchen, zu lösen, was ich fühle, ist ein sehr einfaches Problem, aber ich bin mir nicht sicher, ob es auch etwas Funken Voodoo auftritt.Spark Join Rückgabe Null Werte in den Spalten

Ich habe zwei Tabellen, die beide sehr klein sind. Table A hat etwa 90K Zeilen und hat etwa 2K Zeilen.

Tabelle A

A B C D 
=========== 
a1 b1 c1 d1 
a1 b1 c2 d2 
a1 b1 c3 d3 
a2 b2 c1 d1 
a2 b2 c2 d2 
. 
. 
. 

Tabelle B

A B E F 
=========== 
a1 b1 e1 f1 
a2 b2 e2 f2 

ich einen Tisch wollen, die

Ergebnis Tabelle

A B C D E F 
================= 
a1 b1 c1 d1 e1 f1 
a1 b1 c2 d2 e1 f1 
a2 b2 c1 d1 e2 f2 
. 
. 
. 

ich ein wenig locker war, wie

aussieht, aber die Idee ist, ich will Verknüpfen Sie die Tabelle mit weniger Zeilen in der Tabelle mit mehr Zeilen, und es ist in Ordnung, mehrere verknüpfte Werte in der Final Table zu haben.

Dies sollte wirklich einfach sein:

table_a.join(table_b, table_a.a == table_b.a, table_a.b == table_b.b).select(..stuff..)

JEDOCH für fast alle der resultierenden Werte in der Result Table (was etwa 90K Reihen haben sollte, da Table A über 90K Zeilen hat), erhalte ich null Werte in den Spalten E und F.

Wenn ich das Ergebnis von nur Table B speichern, sehe ich alle Spalten und Werte. Wenn ich das Ergebnis von nur Table A speichern, sehe ich alle Spalten und Werte. (das heißt, ich könnte ein Papier und Bleistift beitreten tun)

Das Seltsame ist, dass, obwohl ~ 89K Reihen null Werte in Spalten E und F im Result Table, gibt es ein paar Werte sind, die zufällig beitreten können.

Weiß jemand, was vor sich geht oder wie ich das diagnostizieren kann?

+0

Entschuldigung, ich kann Ihre Frage falsch lesen. Sagen Sie, dass die E- und F-Spalten meist leer sind? Wenn ja, warum überrascht es dich, dass sie in einem Join auch meistens leer sind? Ihr Code sieht korrekt aus, also frage ich mich, ob Ihr Verständnis der Daten darin besteht, wo das Problem liegt. Um zu beginnen, möchten Sie vielleicht herausfinden, wie viele Zeilen von B sogar an A angefügt werden (vielleicht indem Sie einen Join im Basis-Spark ausführen). Sie sollten auch überlegen, ob Sie einen [Outer-Join oder Inner-Join] erwarten (http://Stackoverflow.com/a/38578/6157047) und das Gegenteil tun (siehe das Argument "how" im Join-Docstring)). –

+0

@nightingalen Sorry für die Verwirrung. Ich sage, dass "Tabelle A" und "Tabelle B" vollständig ausgefüllt sind. Dann, wenn ich mich ihnen anschließe, sind die Spalten, von denen ich erwarte, dass sie Werte haben (nämlich "E" und "F"), "null". Ich möchte mit jeder Zeile von Tabelle A eine Zeile aus der kleineren Tabelle Tabelle B verknüpfen, die vollständig gefüllt ist. Wenn ich einen einzelnen Unit-Test an einigen Mock-Datenframes durchführe, funktioniert es, aber wenn ich in der Produktion laufe, bekomme ich "Null" -Werte. – confused

+0

Ich sehe. Dann würde ich das, was ich gesagt habe, wiederholen: versuchen Sie herauszufinden, wie viele überhaupt beitreten.Sie können dies im Basisfunken tun, um zwischen fehlenden Werten zu unterscheiden, weil die Daten verloren gegangen sind/etwas passiert ist, oder fehlenden Werten, weil es einfach keine äquivalente Tabelle gab. Vielleicht müssen Sie etwas reinigen oder ein anderes Verbindungsspaltenset verwenden. –

Antwort

0

Haben Sie versucht < => anstelle von == in Ihrem beitreten?

+0

Hallo MatthewH, ich suche nach alternativen <=> in pyspark. Ich benutze Version 1.6 von pyspark und die Verwendung von <=> gibt mir einen Syntaxfehler. Kannst du bitte helfen? – orNehPraka