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"))







rdd