apache-spark - read - spark sql example
Spark gibt mehrere Spaltenbedingungen für den Datenrahmen-Join an (5)
Ab der Spark-Version 1.5.0 (die derzeit nicht veröffentlicht ist) können Sie mehrere Datenframe-Spalten verknüpfen. Siehe SPARK-7990: Fügen Sie Methoden hinzu, um Equi-Join für mehrere Join-Schlüssel zu erleichtern .
Python
Leads.join(
Utm_Master,
["LeadSource","Utm_Source","Utm_Medium","Utm_Campaign"],
"left_outer"
)
Scala
Die Frage wurde nach einer Scala-Antwort gestellt, aber ich benutze Scala nicht. Hier ist meine beste Schätzung ....
Leads.join(
Utm_Master,
Seq("LeadSource","Utm_Source","Utm_Medium","Utm_Campaign"),
"left_outer"
)
So geben Sie mehr Spaltenbedingungen beim Verbinden von zwei Datenrahmen an. Zum Beispiel möchte ich Folgendes ausführen:
val Lead_all = Leads.join(Utm_Master,
Leaddetails.columns("LeadSource","Utm_Source","Utm_Medium","Utm_Campaign") ==
Utm_Master.columns("LeadSource","Utm_Source","Utm_Medium","Utm_Campaign"),
"left")
Ich möchte nur beitreten, wenn diese Spalten übereinstimmen. Aber obige Syntax ist nicht gültig, da Spalten nur eine Zeichenkette benötigt. Wie bekomme ich, was ich will?
Die ===
Optionen geben mir doppelte Spalten. Also benutze ich stattdessen Seq
.
val Lead_all = Leads.join(Utm_Master,
Seq("Utm_Source","Utm_Medium","Utm_Campaign"),"left")
Dies funktioniert natürlich nur, wenn die Namen der zusammenführenden Spalten identisch sind.
In Pyspark können Sie einfach jede Bedingung separat angeben:
val Lead_all = Leads.join(Utm_Master,
(Leaddetails.LeadSource == Utm_Master.LeadSource) &
(Leaddetails.Utm_Source == Utm_Master.Utm_Source) &
(Leaddetails.Utm_Medium == Utm_Master.Utm_Medium) &
(Leaddetails.Utm_Campaign == Utm_Master.Utm_Campaign))
Stellen Sie sicher, dass Sie Operatoren und Klammern korrekt verwenden.
In diesem Fall gibt es eine Spark- Spalte / einen Expression-API-Join :
Leaddetails.join(
Utm_Master,
Leaddetails("LeadSource") <=> Utm_Master("LeadSource")
&& Leaddetails("Utm_Source") <=> Utm_Master("Utm_Source")
&& Leaddetails("Utm_Medium") <=> Utm_Master("Utm_Medium")
&& Leaddetails("Utm_Campaign") <=> Utm_Master("Utm_Campaign"),
"left"
)
Der Operator <=>
im Beispiel bedeutet " Gleichheitstest, der für Nullwerte sicher ist ".
Der Hauptunterschied zum einfachen Equality-Test ( ===
) besteht darin, dass der erste sicher verwendet werden kann, falls eine der Spalten Nullwerte haben sollte.
Scala:
Leaddetails.join(
Utm_Master,
Leaddetails("LeadSource") <=> Utm_Master("LeadSource")
&& Leaddetails("Utm_Source") <=> Utm_Master("Utm_Source")
&& Leaddetails("Utm_Medium") <=> Utm_Master("Utm_Medium")
&& Leaddetails("Utm_Campaign") <=> Utm_Master("Utm_Campaign"),
"left"
)
Um es case-unempfindlich zu machen ,
import org.apache.spark.sql.functions.{lower, upper}
Verwenden Sie dann im Zustand der Join-Methode nur lower(value)
.
ZB: dataFrame.filter(lower(dataFrame.col("vendor")).equalTo("fortinet"))