Ein kartesisches Produkt ist eine Verknüpfung ohne Schlüssel verbinden, sie alle Linien eines Datenrahmens auf allen Linien eines anderen Datenrahmen projiziert. Sagen Sie bitte 2 Datenrahmen jeweils A
und B
mit nA
und nB
Reihen haben, dann werden Sie mit einem Datenrahmen mit nA x nB
Zeilen enden.
Was Sie suchen ist eine regelmäßige inner join
mit Verbindungsschlüssel zip
:
A = spark.createDataFrame([[-69,40,"trp"],[-69,41,"nxt"]], ["Lat","lon","zip"])
B = spark.createDataFrame([[-68,43,"trp"],[-89,45,"trp"]], ["Lat","lon","zip"])
A.join(B, "zip").show()
+---+---+---+---+---+
|zip|Lat|lon|Lat|lon|
+---+---+---+---+---+
|trp|-69| 40|-68| 43|
|trp|-69| 40|-89| 45|
+---+---+---+---+---+
Hinweis: mit Spaltennamen Begriffsklärung seien Sie vorsichtig, können Sie zum Beispiel lon, Lat
für jeden Datenrahmen in einer Struktur setzen vor Verbinden sie:
import pyspark.sql.functions as psf
A = A.select("zip", psf.struct("Lat", "Long").alias("A"))
B = B.select("zip", psf.struct("Lat", "Long").alias("B"))
df = A.join(B, "zip")
df.show()
df.printSchema()
+---+--------+--------+
|zip| A| B|
+---+--------+--------+
|trp|[-69,40]|[-68,43]|
|trp|[-69,40]|[-89,45]|
+---+--------+--------+
root
|-- zip: string (nullable = true)
|-- A: struct (nullable = false)
| |-- Lat: long (nullable = true)
| |-- lon: long (nullable = true)
|-- B: struct (nullable = false)
| |-- Lat: long (nullable = true)
| |-- lon: long (nullable = true)
ok. Ist es geeignet, einen Datenrahmen zu schaffen, wenn jeder zip rund 1000 Punkte sagen haben und ich mit Datenrahmen bin Beitritt, die einige 1m Punkte. Oder gibt es alternative Möglichkeiten, wie RDD oder Arrays Tupeln, die weniger Speicherplatz verbrauchen – muni
Sie können 'den kleinen Datenrahmen broadcast' beim Verbinden, dies wird es kopieren everynode Speichernutzung zu optimieren:' A.join (psf.broadcast (B), "zip") ' – MaFF