2017-11-16 4 views
0

I eine pyspark Datenrahmen A haben, das 3 Spalten:Erstellen Breite, Länge Paare zur Entfernungsberechnung, basierend auf zusammenpassenden Reißverschluss in 2 spark Datenrahmen

Lat lon zip 
-69 40 trp 
-69 41 nxt 

I eine andere pyspark Datenrahmen B haben, hat, die gleichen Spalten eingefangen, aber Werte anders sein:

Lat lon zip 
-68 43 trp 
-89 45 trp 

I Breitengrad Längengrad Paare für jeden Datensatz von A erstellen möchten, basierend auf in Datenrahmen zip B. passende

Also wären die RDD-Ausgangspaare wie folgt:

(([-69,40],[-68,43]), 
([-69,40],[-89,45])) 

Kann ich das ohne Schleifen machen? Ich habe versucht, .map hier verwendet zu replizieren: Spark cartesian product

Erfolglos

Antwort

1

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) 
+0

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

+0

Sie können 'den kleinen Datenrahmen broadcast' beim Verbinden, dies wird es kopieren everynode Speichernutzung zu optimieren:' A.join (psf.broadcast (B), "zip") ' – MaFF

Verwandte Themen