DataFrame-Gleichheit in Apache Spark

9

Angenommen df1 und df2 sind zwei DataFrame s in Apache Spark, die mit zwei verschiedenen Mechanismen berechnet wurden, z. B. Spark SQL im Vergleich zur Scala / Java / Python-API.

Gibt es einen idiomatischen Weg, um zu bestimmen, ob die zwei Datenrahmen äquivalent (gleich, isomorph) sind, wobei die Äquivalenz durch die Daten (Spaltennamen und Spaltenwerte für jede Reihe) identisch ist, abgesehen von der Reihenfolge der Zeilen & amp; Spalten?

Die Motivation für die Frage besteht darin, dass es oft viele Möglichkeiten gibt, ein Big-Data-Ergebnis zu berechnen, jedes mit seinen eigenen Kompromissen. Wenn man diese Kompromisse untersucht, ist es wichtig, die Korrektheit zu wahren und daher die Äquivalenz / Gleichheit eines aussagekräftigen Testdatensatzes zu überprüfen.

    
Sim 03.07.2015, 02:00
quelle

5 Antworten

4

Es gibt einige Standardmethoden in den Apache Spark-Testsuiten, aber die meisten beinhalten das Sammeln der Daten lokal und wenn Sie Gleichheitstests auf großen Datenrahmen durchführen wollen, dann ist das wahrscheinlich keine geeignete Lösung.

Überprüfen Sie zuerst das Schema und dann können Sie eine Schnittmenge zu df3 machen und überprüfen, dass die Anzahl von df1, df2 & amp; df3 sind alle gleich (dies funktioniert jedoch nur, wenn es keine doppelten Zeilen gibt, wenn es unterschiedliche Duplikatzeilen gibt, kann diese Methode immer noch wahr ergeben).

Eine andere Option wäre, die zugrundeliegenden RDDs der beiden DataFrames zu erhalten, auf (Row, 1) zu mappen, einen reduceByKey durchzuführen, um die Anzahl jeder Zeile zu zählen und dann die beiden resultierenden RDDs zu coggen und dann ein reguläres Aggregat und Gibt false zurück, wenn einer der Iteratoren nicht gleich ist.

    
Holden 03.07.2015, 09:29
quelle
5

Ich weiß nichts über Idiomatik, aber ich denke, Sie können eine robuste Methode zum Vergleichen von DataFrames erhalten, die Sie wie folgt beschreiben. (Ich verwende PySpark zur Veranschaulichung, aber der Ansatz ist sprachübergreifend.)

%Vor%

Dieser Ansatz behandelt Fälle, in denen die DataFrames doppelte Zeilen, Zeilen in verschiedenen Reihenfolgen und / oder Spalten in verschiedenen Reihenfolgen haben können.

Zum Beispiel:

%Vor%

Dieser Ansatz ist ziemlich teuer, aber der größte Teil der Kosten ist unvermeidlich, da ein vollständiges Diff durchgeführt werden muss. Und das sollte gut skalieren, da es nicht erfordert, lokal etwas zu sammeln. Wenn Sie die Einschränkung lockern, dass der Vergleich doppelte Zeilen berücksichtigen soll, dann können Sie die groupBy() ablegen und tun Sie einfach die subtract() , was die Dinge wahrscheinlich merklich beschleunigen würde.

    
Nick Chammas 14.12.2016 16:55
quelle
4

Die Bibliothek Spark-Fast-Tests enthält zwei Methoden zum Vergleichen von Dataframes (ich bin der Schöpfer von die Bibliothek):

Die Methode assertSmallDataFrameEquality sammelt DataFrames auf dem Treiberknoten und führt den Vergleich durch

%Vor%

Die Methode assertLargeDataFrameEquality vergleicht Datenrahmen, die auf mehreren Maschinen verteilt sind (der Code wird im Grunde von spark-test-base )

%Vor%

assertSmallDataFrameEquality ist schneller für kleine Dataframe-Vergleiche und ich habe es für meine Testsuiten ausreichend gefunden.

    
Powers 09.05.2017 22:44
quelle
0

Sie können dies mit ein wenig Deduplizierung in Kombination mit einem vollständigen äußeren Join tun. Der Vorteil dieses Ansatzes besteht darin, dass Sie keine Ergebnisse für den Treiber sammeln müssen und dass das Ausführen mehrerer Jobs vermieden wird.

%Vor%     
Herman van Hovell 10.05.2017 06:30
quelle
0

Java:

%Vor%     
user1442346 18.10.2017 01:59
quelle