2016-02-16 6 views
8

Ich bin immer noch schwer zu verstehen, die volle Kraft der kürzlich eingeführten Spark Datasets.Was ist der Unterschied zwischen Spark DataSet und RDD

Gibt es Best Practices für die Verwendung von RDDs und die Verwendung von Datasets?

In ihrem announcement Databricks erklärt, dass durch die Verwendung von Datasets erstaunliche Reduzierungen in Laufzeit und Speicher erreicht werden können. Dennoch wird behauptet, dass Datasets so konzipiert sind, dass sie neben der bestehenden RDD-API funktionieren.

Ist dies nur ein Hinweis auf die Abwärtskompatibilität oder gibt es Szenarien, in denen man RDDs gegenüber Datasets bevorzugen würde?

+0

Check diesen Link auch: https: // Stackoverflow.com/a/45253013/1592191 – mrsrinivas

Antwort

14

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:

+1

Vielen Dank für die ausführliche Antwort! –