2016-06-22 3 views
0

Ich dachte, ich wüsste, dass SQL-Joins, aber jetzt bin ich mir nicht so sicher. Ich habe einen Datenrahmen mit Filmbewertungen und einen anderen Datenrahmen mit userIds und deren Indizes. Ich möchte beiden Datenrahmen beitreten, so dass ich den entsprechenden Benutzerindex für jede Filmbewertung habe. Aber nachdem ich mich den Tabellen angeschlossen habe, bekomme ich mehr Datensätze als vor dem Beitritt, was für mich keinen Sinn ergibt. Ich erwarte, die gleiche Anzahl von Datensätzen zu bekommen, aber mit einer zusätzlichen Spalte von u_number: Meine erste Idee war, Links mit ratingsDf als linken und userDataFrame als rechts zu verwenden, aber ich bekomme unerwünschte Ergebnisse mit einem der Joins ich versuchte.Spark (Scala) sqlDataFrame Joins funktioniert nicht wie erwartet

Der Befehl i für die Join verwenden:

val ratingsUsers = ratingsDf.join(userDataFrame, ratingsDf("uid") === userDataFrame("uid"),"left") 

Dies sind die Tabellen:

scala> ratingsDf.show(5) 
+--------------+----------+------+ 
|   uid|  mid|rating| 
+--------------+----------+------+ 
|A1V0C9SDO4DKLA|B0002IQNAG| 4.0| 
|A38WAOQVVWOVEY|B0002IQNAG| 4.0| 
|A2JP0URFHXP6DO|B0002IQNAG| 5.0| 
|A2X4HJ26YWTGJU|B0002IQNAG| 5.0| 
|A3A98961GZKIGD|B0002IQNAG| 5.0| 
+--------------+----------+------+ 
scala> userDataFrame.show(5) 
+--------------+--------+ 
|   uid|u_number| 
+--------------+--------+ 
|A10049L7AJW9M7|  0| 
|A1007G0226CSWC|  1| 
|A100FQCUCZO2WG|  2| 
|A100JCBNALJFAW|  3| 
|A100K3KEMSVSCM|  4| 
+--------------+--------+ 
+2

Dies ist ein typisches Problem mit doppelten Schlüsseln, wie ich weiß. – WoodChopper

+2

Nur klärende @ WoodChopper Punkt - die Verdoppelung im Ergebnis bedeutet wahrscheinlich, dass Sie nicht eindeutige Werte für "UID" in "userDataFrame" haben - wenn diese Spalte eindeutig ist linken Link sollte ein Ergebnis mit der gleichen Größe wie "ratingsDf" –

Antwort

1

So das Problem war in der Tat ein Problem mit doppelten Schlüssel in der UserDataFrame. Das Problem war ich .distinct() auf der Benutzer-RDD, die hatte (k, v) Tupel und ich dachte distinct() nur auf Schlüsseln, aber es berücksichtigt das ganze Tupel, die mich mit doppelten Schlüsseln im Datenrahmen erstellt von diesem rdd.

Danke für die Hilfe.

Verwandte Themen