In diesem Moment (Spark 1.6.0) DataSet
API ist nur eine Vorschau und nur eine kleine Teilmenge von Funktionen ist implementiert, so dass es nicht möglich ist, etwas über Best Practices zu sagen.
Konzeptionell Funken DataSet
ist nur ein DataFrame
mit zusätzlicher Typ Sicherheit (oder wenn Sie es vorziehen a glance at the futureDataFrame
ist ein DataSet[Row]
). Es bedeutet, dass Sie alle benefits of Catalyst und Tungsten bekommen. Es umfasst logische und physische Planoptimierung, vektorisierte Operationen und Low-Level-Speicherverwaltung.
Was Sie verlieren, ist Flexibilität und Transparenz.
Zuerst müssen Ihre Daten codiert werden, bevor sie mit DataSet
verwendet werden können. Spark stellt Encoder für primitive Typen und Produkte/Fallklassen bereit, und für die API, die für die Definition einer benutzerdefinierten Serialisierung erforderlich ist, steht derzeit keine API zur Verfügung. Höchstwahrscheinlich wird es relativ zu UDT API (siehe zum Beispiel How to define schema for custom type in Spark SQL?, Serialize/Deserialize existing class for spark sql dataframe) mit all seinen Problemen ähnlich sein. Es ist relativ ausführlich, erfordert zusätzlichen Aufwand und kann bei komplexen Objekten nicht offensichtlich sein. Außerdem berührt es einige Aspekte der API auf niedrigerer Ebene, die nicht sehr gut dokumentiert sind.
In Bezug auf Transparenz ist es fast das gleiche Problem wie bei einem Planer in einem typischen RDBMS. Es ist großartig, bis es nicht ist. Es ist ein erstaunliches Tool, es kann Ihre Daten analysieren, intelligente Transformationen durchführen, aber als jedes Werkzeug kann es einen falschen Weg nehmen und lässt den Ausführungsplan durchblicken und versucht herauszufinden, wie die Dinge funktionieren.
Basierend auf einer Vorschau würde ich sagen, dass es irgendwo zwischen DataFrame
API und RDD API platziert werden kann. Es ist flexibler als DataFrames
, bietet jedoch ähnliche Optimierungen und eignet sich gut für allgemeine Datenverarbeitungsaufgaben. Es bietet nicht die gleiche Flexibilität (zumindest ohne einen tieferen Einblick in die Catalyst-Interna) wie eine RDD-API.
Ein anderer Unterschied, der im Moment nur hypothetisch ist, ist eine Art, wie er mit Gastsprachen interagiert (R, Python). Ähnlich wie DataFrame
gehört DataSet
zu JVM. Das bedeutet, dass jede mögliche Interaktion zu einer von zwei Kategorien gehören kann: native JVM-Operation (wie DataFrame
Ausdrücke) und Gast-Seitencode (wie Python UDF). Leider erfordert der zweite Teil einen kostspieligen Hin- und Rückflug zwischen JVM und einer Gastumgebung. auch
Siehe:
Check diesen Link auch: https: // Stackoverflow.com/a/45253013/1592191 – mrsrinivas