Spark SQL DataFrame/Dataset Ausführungs-Engine verfügt über mehrere äußerst effiziente Zeit & Speicherplatzoptimierungen (z. B. InternalRow & Ausdruck CodeGen). Nach vielen Dokumentationen scheint es für die meisten verteilten Algorithmen eine bessere Option als RDD zu sein.Wann sollte die Spark DataFrame/Dataset API verwendet werden und wann sollte man RDD verwenden?
Allerdings habe ich einige Quellcode-Forschung und bin immer noch nicht überzeugt. Ich habe keinen Zweifel, dass InternalRow viel kompakter ist und viel Speicher sparen kann. Die Ausführung von Algorithmen kann jedoch nicht schneller vordefinierte Ausdrücke speichern. Es ist nämlich in der Source org.apache.spark.sql.catalyst.expressions.ScalaUDF
angegeben, dass jeder Benutzer definierte Funktion tut 3 Dinge:
- convert Katalysatortyp (verwendet in INTERNALROW) zu Scala Typ (verwendet in GenericRow).
- anwenden, um die Funktion
- konvertieren von scala Typ Katalysatortyp das Ergebnis zurück
Offenbar ist dies sogar noch langsamer als nur ohne Konvertierung die Funktion direkt auf RDD Anwendung. Kann jemand meine Spekulation durch eine echte Profilerstellung und Codeanalyse bestätigen oder leugnen?
Vielen Dank für jede Anregung oder Einsicht.