2015-08-24 12 views
8

Ich versuche, zwei DataFrames miteinander zu verbinden, nachdem einige frühere Berechnungen durchgeführt wurden. Der Befehl ist einfach:Spark SQL Ausführen von Carthesian Join statt Inner Join

employee.join(employer, employee("id") === employer("id")) 

jedoch die Verbindung scheint, völlig meine === Aussage ignoriert karthesischen beitreten auszuführen. Hat jemand eine Idee, warum passiert das?

+0

Willkommen bei SO NNamed. Wenn Sie um Hilfe bitten, sollten Sie uns eine Chance geben :) Ein guter Anfang ist, ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) bereitzustellen. – zero323

Antwort

21

Ich glaube, ich habe mit dem gleichen Problem gekämpft. Überprüfen Sie, ob Sie eine Warnung haben:

Constructing trivially true equals predicate [..] 

Nach dem Erstellen der Join-Operation. Wenn dies der Fall ist, aliasieren Sie einfach eine der Spalten in einem Mitarbeiter- oder Arbeitgeber-Datenrahmen, z. dies wie:

employee.select(<columns you want>, employee("id").as("id_e")) 

Führen Sie dann auf employee("id_e") === employer("id") beizutreten.

Erläuterung. Schauen Sie sich den Betriebsablauf:

enter image description here

Wenn Sie direkt Datenrahmen B Ihren Datenrahmen A verwenden zu berechnen und sie zusammen auf der Spalte Id verbinden, die aus dem Datenrahmen A kommt, werden Sie nicht der Durchführung werden beitreten wollen Sie tun. Die ID-Spalte von DataFrameB ist tatsächlich die exakt gleiche Spalte von DataFrameA, also wird Spark nur bestätigen, dass die Spalte mit sich selbst übereinstimmt und daher das trivial wahre Prädikat. Um dies zu vermeiden, müssen Sie eine der Spalten aliasieren, damit sie als "verschiedene" Spalten für spark erscheinen. Vorerst nur die Warnmeldung auf diese Weise wurde implementiert:

def === (other: Any): Column = { 
    val right = lit(other).expr 
    if (this.expr == right) { 
     logWarning(
     s"Constructing trivially true equals predicate, '${this.expr} = $right'. " + 
      "Perhaps you need to use aliases.") 
    } 
    EqualTo(expr, right) 
    } 

Es ist nicht eine sehr gute Lösung Lösung für mich (es ist wirklich einfach, um die Warnmeldung zu verpassen), ich hoffe, das wird irgendwie fixiert werden.

Sie haben Glück, die Warnmeldung zu sehen, it has been added not so long ago;).

+0

Das war wirklich das! Vielen Dank! – NNamed

+0

Ich kämpfte die meiste Zeit eines Wochenendes damit, Join-Probleme in 1.5.2 zu beheben - das war eines der zwei Probleme und deine Antwort ersparte viel Frust. Vielen Dank! – Pyrce

+0

Hatte die gleiche Frustration zu durchlaufen, bis ich begann, in Spark-Code zu graben;). – Niemand