2016-03-19 11 views
2

ich diese beiden Datenrahmen haben:Pyspark: Multiplizieren Spalten aus verschiedenen Tabellen

df1 = sc.parallelize([ 
['u1', 0.5], 
['u2', 0.2], 
['u3', 0.1], 
['u4', 0.9], 
['u5', 0.7] 
]).toDF(('person', 'score')) 

df2 = sc.parallelize([ 
['d1', 0.0], 
['d2', 0.5], 
['d3', 0.7], 
]).toDF(('dog', 'score')) 

Was muss ich tun wird, wäre eine weitere Datenrahmen, dessen Schema erstellt werden

Person, Hund, score_person * score_dog

so im Grunde multipliziert die Spalte score in beiden Datenrahmen und die beiden ersten Spalten zu halten. Diese Multiplikation muss für jedes mögliche Paar von Faktoren stattfinden, d. H. Jede Person mit jedem Hund, so dass mein Ergebnisdatenblock 15 Zeilen hätte.

Ich kann keinen Weg finden, dies zu erhalten, es scheint mir, dass es eine SELECT auf beiden Datenrahmen passieren muss, aber kein JOIN oder UNION kann helfen.

Antwort

4

Typischerweise cartesianischen Produkt ist etwas, das man aber einfach join ohne on Parameter vermeiden wollen alles brauchen Sie hier:

df1.join(df2).select("person", "dog", (df1.score * df2.score).alias("product")) 
+0

Sieht großartig, einen Grund, warum ich Dinge wie diese, obwohl erhalten: Row (person = u‘ u1 ', Hund = u'd2', Produkt = None) (die None)? Es gibt mehrere im Ergebnis und einige andere sind 0. Ist es ein Problem mit Typen? –

+0

Es ist. 'type (0)' (der Teil, den ich korrigiert habe) ist 'int', während' type (0.5) '' float' ist. Spark 'DataFrame' kann nur einen einzigen Typ enthalten (der erste Wert wird zum Bestimmen des Schemas verwendet) und alle anderen Werte werden verworfen. Sie können überprüfen, ob es vor dem 'Join' passiert. – zero323

Verwandte Themen