Lassen Sie mich ein einfaches Beispiel zu erklären, was ich versuche zu tun. lassen Sie uns sagen, dass wir, wie unten zwei sehr einfache Datenrahmen haben:Wie man neue Spalten basierend auf kartesischen Produkt von mehreren Spalten von pyspark Datenrahmen erstellen
Df1
+---+---+---+
| a1| a2| a3|
+---+---+---+
| 2| 3| 7|
| 1| 9| 6|
+---+---+---+
Df2
+---+---+
| b1| b2|
+---+---+
| 10| 2|
| 9| 3|
+---+---+
Von DF1, DF2, brauchen wir eine neue df mit Spalten erstellen, die cartesianischen Produkt von Original-Spalten von DF1, DF2 sind. Insbesondere wird das neue df "a1b1", "a1b2", "a2b1", "a2b2", "a3b1", "a3b2" haben, und die Zeilen werden die Multiplikation der entsprechenden Spalten von df1, df2 sein. Ergebnis df sollte wie folgt aussehen:
Df3
+----+----+----+----+----+----+
|a1b1|a1b2|a2b1|a2b2|a3b1|a3b2|
+----+----+----+----+----+----+
| 20| 4| 30| 6| 70| 14|
| 9| 3| 81| 27| 54| 18|
+----+----+----+----+----+----+
ich gesucht habe Funken Online-Dokumentation sowie Fragen hier gepostet, aber es scheint, dass sie alle über kartesisches Produkt von Zeilen, Spalten nicht. Zum Beispiel rdd.cartesian() liefert kartesisches Produkt unterschiedlicher Kombination von Werten in der Reihe, wie der folgenden Code:
r = sc.parallelize([1, 2])
r.cartesian(r).toDF().show()
+---+---+
| _1| _2|
+---+---+
| 1| 1|
| 1| 2|
| 2| 1|
| 2| 2|
+---+---+
Aber das ist nicht das, was ich brauche. Auch hier muss ich neue Spalten anstelle von Zeilen erstellen. Die Anzahl der Zeilen bleibt in meinem Problem gleich. Ich verstehe, udf kann das Problem schließlich lösen. In meiner realen Anwendung haben wir jedoch einen riesigen Datensatz, der zu lange dauert, um alle Spalten zu erstellen (etwa 500 neue Spalten als die möglichen Kombinationen von Spalten). Wir bevorzugen einige Arten von Vektoroperationen, die die Effizienz erhöhen können. Ich mag mich irren, aber Spark UDF scheint auf Reihenoperationen zu basieren, was der Grund sein könnte, warum es so lange gedauert hat.
Vielen Dank für Anregungen/Feedback/Kommentare.
Für Ihre Bequemlichkeit angebracht ich den einfachen Code hier das Beispiel erstellen Datenrahmen oben gezeigt:
df1 = sqlContext.createDataFrame([[2,3,7],[1,9,6]],['a1','a2','a3'])
df1.show()
df2 = sqlContext.createDataFrame([[10,2],[9,3]],['b1','b2'])
df2.show()
Wie verknüpfen Sie Zeilen? Ordnung ist nicht etwas, auf das Sie sich im Allgemeinen verlassen können. – zero323
Hi Zero323, danke für deine Nachricht. Wir haben einen Primärschlüssel zum Verknüpfen von Zeilen. Hier nehmen wir einfach an, dass Zeilen durch ganzzahlige Indizes übereinstimmen und alle Datenfelder die gleiche Anzahl von Zeilen haben. – spectrum
OK, also Profi-Tipp: Einen expliziten Schlüssel zu haben ist gut. In Abhängigkeit von den Indizes ist das nicht :) Im Allgemeinen 'df1.join (df2, ['id']). (Xfx) für x in df1.columns für y in df2.columns, wenn x! = 'id' und y! = 'id']), wenn 'id' eine Verknüpfungsspalte ist. – zero323