Unterschied zwischen DataFrame (in Spark 2.0 dh DataSet ) und RDD in Spark

Ich frage mich nur, was ist der Unterschied zwischen einer RDD und DataFrame (Spark 2.0.0 DataFrame ist ein bloßer Typ-Alias ​​für Dataset[Row] ) in Apache Spark?

Kannst du eines in das andere konvertieren?

    Ein DataFrame ist bei einer Google-Suche nach “DataFrame-Definition” gut definiert:

    Ein Datenrahmen ist eine Tabelle oder eine zweidimensionale arrayähnliche Struktur, in der jede Spalte Messungen an einer Variablen enthält und jede Zeile einen Fall enthält.

    Ein DataFrame verfügt daher aufgrund seines Tabellenformats über zusätzliche Metadaten, mit denen Spark bestimmte Optimierungen für die finalisierte Abfrage ausführen kann.

    Eine RDD andererseits ist lediglich ein resilientielles D ataset, das eher eine Blackbox von Daten ist, die nicht optimiert werden können, da die Operationen, die dagegen ausgeführt werden können, nicht so eingeschränkt sind.

    Sie können jedoch von einem DataFrame über die rdd Methode zu einer RDD rdd und über die rdd Methode von einer RDD zu einem DataFrame (wenn die RDD in einem Tabellenformat toDF )

    Im Allgemeinen wird empfohlen, einen DataFrame wo dies aufgrund der integrierten Abfrageoptimierung möglich ist.

    Als erstes wurde DataFrame aus SchemaRDD .

    depreated Methode toSchemaRDD

    Ja .. Konvertierung zwischen Dataframe und RDD ist absolut möglich.

    Im Folgenden finden Sie einige Beispielcode-Snippets.

    • df.rdd ist RDD[Row]

    Im Folgenden sind einige Optionen zum Erstellen eines Datenrahmens aufgeführt.

    • 1) yourrddOffrow.toDF konvertiert zu DataFrame .

    • 2) Verwenden von createDataFrame von SQL-Kontext

      val df = spark.createDataFrame(rddOfRow, schema)

    wo Schema kann von einigen der unten genannten Optionen sein, wie durch nette SO Post beschrieben ..
    Von scala case class und scala reflection api

     import org.apache.spark.sql.catalyst.ScalaReflection val schema = ScalaReflection.schemaFor[YourScalacaseClass].dataType.asInstanceOf[StructType] 

    ODER mit Encoders

     import org.apache.spark.sql.Encoders val mySchema = Encoders.product[MyCaseClass].schema 

    wie von Schema beschrieben, kann auch mit StructType und StructField

     val schema = new StructType() .add(StructField("id", StringType, true)) .add(StructField("col1", DoubleType, true)) .add(StructField("col2", DoubleType, true)) etc... 

    Bildbeschreibung

    Tatsächlich gibt es jetzt 3 Apache Spark APIs.

    Bildbeschreibung hier eingeben

    1. RDD API:

    Die RDD API (Resilient Distributed Dataset) befindet sich seit der Version 1.0 in Spark.

    Die RDD API stellt viele Transformationsmethoden bereit, z. B. map (), filter () und reduce () zum Ausführen von Berechnungen an den Daten. Jede dieser Methoden führt zu einer neuen RDD die die transformierten Daten darstellt. Diese Methoden definieren jedoch nur die auszuführenden Operationen, und die Transformationen werden erst ausgeführt, wenn eine Aktionsmethode aufgerufen wird. Beispiele für Aktionsmethoden sind collect () und saveAsObjectFile ().

    RDD Beispiel:

     rdd.filter(_.age > 21) // transformation .map(_.last)// transformation .saveAsObjectFile("under21.bin") // action 

    Beispiel: Nach Attribut mit RDD filtern

     rdd.filter(_.age > 21) 
    1. DataFrame API

    Spark 1.3 führte eine neue DataFrame API als Teil der Project Tungsten-Initiative ein, mit der die performance und Skalierbarkeit von Spark verbessert werden soll. Die DataFrame API führt das Konzept eines Schemas zur Beschreibung der Daten ein, das es Spark ermöglicht, das Schema zu verwalten und nur Daten zwischen den Knoten auf wesentlich effizientere Weise als mit der Java-Serialisierung zu übergeben.

    Die DataFrame API unterscheidet sich DataFrame von der RDD API, da es sich um eine API zum DataFrame eines relationalen Abfrageplans handelt, den der Catalyst-Optimierer von Spark dann ausführen kann. Die API ist für Entwickler, die mit der Erstellung von Abfrageplänen vertraut sind, selbstverständlich

    Beispiel SQL-Stil:

    df.filter("age > 21");

    Einschränkungen: Da sich der Code auf Datenattribute nach Name bezieht, ist es dem Compiler nicht möglich, Fehler zu erfassen. Wenn Attributnamen nicht korrekt sind, wird der Fehler erst zur Laufzeit beim Erstellen des Abfrageplans erkannt.

    Ein weiterer Nachteil der DataFrame API besteht darin, dass sie sehr DataFrame ist und obwohl sie Java unterstützt, ist die Unterstützung begrenzt.

    Wenn beispielsweise ein DataFrame aus einem vorhandenen RDD von Java-Objekten erstellt wird, kann Sparks Catalyst-Optimierer das Schema nicht ableiten und nimmt an, dass alle Objekte im DataFrame die scala.Product Schnittstelle implementieren. Die Scala- case class arbeitet die Box aus, weil sie diese Schnittstelle implementiert.

    1. Dataset API

    Die Dataset API, die als API-Vorschau in Spark 1.6 veröffentlicht wurde, zielt darauf ab, das Beste aus beiden Welten zu bieten. der bekannte objektorientierte Programmierstil und die Kompilierungszeit für die Typsicherheit der RDD API, jedoch mit den performancesvorteilen des Catalyst-Abfrageoptimierers. Datasets verwenden außerdem denselben effizienten Off-Heap-Speichermechanismus wie die DataFrame API.

    Wenn es um das Serialisieren von Daten geht, hat die Dataset API das Konzept von Codierern, die zwischen JVM-Darstellungen (Objekten) und Sparks internem Binärformat übersetzen. Spark verfügt über integrierte Encoder, die sehr fortschrittlich sind, da sie Bytecode generieren, um mit Off-Heap-Daten zu interagieren und bei Bedarf Zugriff auf einzelne Attribute zu gewähren, ohne ein gesamtes Objekt deserialisieren zu müssen. Spark bietet noch keine API zum Implementieren von benutzerdefinierten Encodern, aber das ist für eine zukünftige Version geplant.

    Darüber hinaus ist das Dataset API so konzipiert, dass es sowohl mit Java als auch mit Scala funktioniert. Bei der Arbeit mit Java-Objekten ist es wichtig, dass sie vollständig Bean-konform sind.

    Beispiel Dataset API SQL-Stil:

     dataset.filter(_.age < 21); 

    Bewertungen diff. zwischen DataFrame und DataSet : Bildbeschreibung hier eingeben

    RDD

    Die Hauptabstraktion, die Spark bereitstellt, ist ein resilient verteilter Datensatz (RDD), bei dem es sich um eine Sammlung von Elementen handelt, die über die Knoten des Clusters verteilt sind, die parallel betrieben werden können.

    RDD Eigenschaften: –

    • Verteilte Sammlung:
      RDD verwendet MapReduce-Operationen, die für die Verarbeitung großer Datasets mit einem parallelen, verteilten Algorithmus auf einem Cluster verwendet werden. Es ermöglicht Benutzern, parallele Berechnungen mit einer Reihe von Operatoren auf hoher Ebene zu schreiben, ohne sich um die Arbeitsverteilung und Fehlertoleranz kümmern zu müssen.

    • Unveränderlich: RDDs bestehen aus einer Sammlung von Datensätzen, die partitioniert sind. Eine Partition ist eine grundlegende Parallelitätseinheit in einer RDD, und jede Partition ist eine logische Division von Daten, die unveränderbar ist und durch einige Transformationen auf vorhandenen Partitionen erstellt wird. Die Unverwechselbarkeit hilft, Konsistenz bei Berechnungen zu erreichen.

    • Fehlertoleranz: Wenn wir eine Partition von RDD verlieren, können wir die Transformation auf dieser Partition in einer Reihe wiedergeben, um die gleiche Berechnung zu erzielen, anstatt Daten über mehrere Knoten hinweg zu replizieren. Dieses Merkmal ist der größte Vorteil von RDD, da es spart viel Aufwand bei der Datenverwaltung und -replikation und damit schnellere Berechnungen.

    • Faule Auswertungen: Alle Transformationen in Spark sind faul, da sie ihre Ergebnisse nicht sofort berechnen. Stattdessen erinnern sie sich nur an die Transformationen, die auf ein Basisdatenset angewendet wurden. Die Transformationen werden nur berechnet, wenn eine Aktion erfordert, dass ein Ergebnis an das Treiberprogramm zurückgegeben wird.

    • functionale Transformationen: RDDs unterstützen zwei Arten von Operationen: Transformationen, die ein neues Dataset aus einem vorhandenen erstellen, und Aktionen, die nach Ausführung einer Berechnung für das Dataset einen Wert an das Treiberprogramm zurückgeben.

    • Datenverarbeitungsformate:

    Es kann einfach und effizient sowohl strukturierte als auch unstrukturierte Daten verarbeiten.

    • Unterstützte Programmiersprachen:
      RDD-API ist in Java, Scala, Python und R verfügbar.

    RDD Einschränkungen: –

    • Keine integrierte Optimierungs-Engine: Beim Arbeiten mit strukturierten Daten können RDDs die erweiterten Optimizer von Spark, einschließlich des Catalyst Optimizer und der Tungsten-Ausführungs-Engine, nicht nutzen. Entwickler müssen jede RDD basierend auf ihren Attributen optimieren.

    • Umgang mit strukturierten Daten: Im Gegensatz zu Datenrahmen und Datasets leiten RDDs das Schema der aufgenommenen Daten nicht ab und erfordern die Angabe durch den Benutzer.

    Datenrahmen

    Spark hat Dataframes in Spark 1.3 eingeführt. Dataframe überwindet die wichtigsten Herausforderungen, die RDDs hatten.

    Ein DataFrame ist eine verteilte Sammlung von Daten, die in benannten Spalten organisiert sind. Es entspricht im Prinzip einer Tabelle in einer relationalen database oder einem R / Python-Dataframe. Neben Dataframe hat Spark auch den Catalyst Optimizer eingeführt, der erweiterte Programmierfunktionen nutzt, um einen erweiterbaren Abfrageoptimierer zu erstellen.

    Datenrahmen Features: –

    • Verteilte Sammlung von Row-Objekten: Ein DataFrame ist eine verteilte Sammlung von Daten, die in benannte Spalten unterteilt sind. Es ist konzeptionell äquivalent zu einer Tabelle in einer relationalen database, aber mit umfangreicheren Optimierungen unter der Haube.

    • Datenverarbeitung: Verarbeitung von strukturierten und unstrukturierten Datenformaten (Avro, CSV, Elastic Search und Cassandra) und Speichersystemen (HDFS, HIVE-Tabellen, MySQL usw.). Es kann lesen und schreiben von all diesen verschiedenen Datenquellen.

    • Optimierung mit Catalyst Optimizer: Es unterstützt sowohl SQL-Abfragen als auch die DataFrame-API. Dataframe verwendet das Framework für die Transformation von Katalysatorbäumen in vier Phasen,

       1.Analyzing a logical plan to resolve references 2.Logical plan optimization 3.Physical planning 4.Code generation to compile parts of the query to Java bytecode. 
    • Hive-Kompatibilität: Mit Spark SQL können Sie unmodifizierte Hive-Abfragen in Ihren vorhandenen Hive-Lages ausführen. Es nutzt Hive-Frontend und MetaStore und bietet Ihnen volle Kompatibilität mit vorhandenen Hive-Daten, Abfragen und UDFs.

    • Tungsten: Tungsten bietet ein physikalisches Ausführungs-Backend, das den Speicher explizit verwaltet und dynamisch Bytecode für die Ausdruckauswertung generiert.

    • Unterstützte Programmiersprachen:
      Die Dataframe-API ist in Java, Scala, Python und R verfügbar.

    Datenrahmenbeschränkungen: –

    • Sicherheit bei der Kompilierungszeit: Wie bereits erwähnt, unterstützt die Dataframe-API die Sicherheit bei der Kompilierungszeit nicht, so dass Sie keine Daten manipulieren können, wenn die Struktur nicht bekannt ist. Das folgende Beispiel funktioniert während der Kompilierzeit. Sie erhalten jedoch eine Runtime-Ausnahme, wenn Sie diesen Code ausführen.

    Beispiel:

     case class Person(name : String , age : Int) val dataframe = sqlContect.read.json("people.json") dataframe.filter("salary > 10000").show => throws Exception : cannot resolve 'salary' given input age , name 

    Dies ist besonders dann eine Herausforderung, wenn Sie mit mehreren Transformations- und Aggregationsschritten arbeiten.

    • Kann auf Domain-Objekt nicht funktionieren (verlorenes Domain-Objekt): Nachdem Sie ein Domain-Objekt in ein Dataframe umgewandelt haben, können Sie es nicht erneut daraus generieren. Im folgenden Beispiel werden wir, sobald wir personDF aus personRDD erstellt haben, den ursprünglichen RDD der Personenklasse (RDD [Person]) nicht wiederherstellen.

    Beispiel:

     case class Person(name : String , age : Int) val personRDD = sc.makeRDD(Seq(Person("A",10),Person("B",20))) val personDF = sqlContect.createDataframe(personRDD) personDF.rdd // returns RDD[Row] , does not returns RDD[Person] 

    Dataset-API

    Dataset API ist eine Erweiterung von DataFrames, die eine typsichere, objektorientierte Programmierschnittstelle bietet. Es ist eine stark typisierte, unveränderliche Sammlung von Objekten, die einem relationalen Schema zugeordnet sind.

    Im core des Datasets ist API ein neues Konzept, das als Encoder bezeichnet wird und für die Konvertierung zwischen JVM-Objekten und der tabellarischen Darstellung verantwortlich ist. Die tabellarische Darstellung wird im internen Spark-Tungsten-Binärformat gespeichert, wodurch Operationen mit serialisierten Daten und eine verbesserte Speichernutzung möglich sind. Spark 1.6 bietet Unterstützung für die automatische Generierung von Encodern für eine Vielzahl von Typen, einschließlich primitiver Typen (z. B. String, Integer, Long), Scala-Fallklassen und Java Beans.

    Datensatzmerkmale: –

    • Bietet das Beste aus RDD und Dataframe: RDD (funktionale Programmierung, typsicher), DataFrame (relationales Modell, Query-Optimierung, Tungsten-Ausführung, Sortierung und Shuffling)

    • Encoder: Durch die Verwendung von Encodern ist es einfach, jedes JVM-Objekt in ein Dataset zu konvertieren, sodass Benutzer im Gegensatz zu Dataframe sowohl mit strukturierten als auch unstrukturierten Daten arbeiten können.

    • Unterstützte Programmiersprachen: Die API Datasets ist derzeit nur in Scala und Java verfügbar. Python und R werden derzeit in Version 1.6 nicht unterstützt. Python-Unterstützung ist für Version 2.0 vorgesehen.

    • Typ Sicherheit: Die API für Datasets bietet Sicherheit bei der Kompilierungszeit, die in Dataframes nicht verfügbar war. Im folgenden Beispiel können Sie sehen, wie Dataset auf Domänenobjekten mit kompilierten Lambda-functionen arbeiten kann.

    Beispiel:

     case class Person(name : String , age : Int) val personRDD = sc.makeRDD(Seq(Person("A",10),Person("B",20))) val personDF = sqlContect.createDataframe(personRDD) val ds:Dataset[Person] = personDF.as[Person] ds.filter(p => p.age > 25) ds.filter(p => p.salary > 25) // error : value salary is not a member of person ds.rdd // returns RDD[Person] 
    • Interoperabel: Mit Datasets können Sie Ihre vorhandenen RDDs und Dataframes einfach in Datasets ohne Standardcode konvertieren.

    Datasets API Beschränkung: –

    • Erfordert Typ Casting zu String: Das Abfragen der Daten aus Datasets erfordert derzeit die Angabe der Felder in der class als String. Sobald wir die Daten abgefragt haben, müssen wir die Spalte in den erforderlichen Datentyp umwandeln. Auf der anderen Seite wird der Catalyst-Optimizer nicht verwendet, wenn die Kartenoperation für Datasets verwendet wird.

    Beispiel:

     ds.select(col("name").as[String], $"age".as[Int]).collect() 

    Keine Unterstützung für Python und R: Seit Release 1.6 unterstützen Datasets nur noch Scala und Java. Python-Unterstützung wird in Spark 2.0 eingeführt.

    Die Datasets-API bringt gegenüber der bestehenden RDD- und Dataframe-API mehrere Vorteile mit verbesserter Typsicherheit und funktionaler Programmierung. Mit der Herausforderung der Typ-Casting-Anforderungen in der API würden Sie immer noch nicht die erforderliche Typsicherheit erreichen und Ihren Code spröde machen.

    Simply RDD ist eine corekomponente, aber DataFrame ist eine API, die in spark 1.30 eingeführt wurde.

    RDD

    Sammlung von Datenpartitionen namens RDD . Diese RDD muss folgenden Eigenschaften folgen:

    • Unveränderlich,
    • Fehlertoleranz,
    • Verteilt,
    • Mehr.

    Hier ist RDD entweder strukturiert oder unstrukturiert.

    Datenrahmen

    DataFrame ist eine API, die in Scala, Java, Python und R verfügbar ist. Sie ermöglicht die Verarbeitung beliebiger strukturierter und halbstrukturierter Daten. Um DataFrame zu definieren, wird eine Sammlung verteilter Daten in benannten Spalten namens DataFrame . Sie können die RDDs im DataFrame einfach optimieren. Mit DataFrame können Sie JSON-Daten, DataFrame und HiveQL-Daten gleichzeitig DataFrame .

     val sampleRDD = sqlContext.jsonFile("hdfs://localhost:9000/jsondata.json") val sample_DF = sampleRDD.toDF() 

    Hier betrachten Sample_DF als DataFrame . sampleRDD heißt (Rohdaten) RDD .

    Alle (RDD, DataFrame und DataSet) in einem Bild

    RDD vs DataFrame vs DataSet

    Bildnachweise

    RDD

    RDD ist eine errorstolerante Sammlung von Elementen, die parallel betrieben werden können.

    Datenrahmen

    DataFrame ist ein Dataset, das in benannte Spalten unterteilt ist. Es ist konzeptionell äquivalent zu einer Tabelle in einer relationalen database oder einem Datenrahmen in R / Python, aber mit umfangreicheren Optimierungen unter der Haube .

    Datensatz

    Dataset ist eine verteilte Sammlung von Daten. Dataset ist eine neue in Spark 1.6 hinzugefügte Schnittstelle, die die Vorteile von RDDs (starke Typisierung, die Fähigkeit, leistungsstarke Lambda-functionen zu verwenden) mit den Vorteilen der optimierten Ausführungsengine von Spark SQL bietet.


    Hinweis:

    Datensatzdaten von Zeilen ( Dataset[Row] ) in Scala / Java werden oft als Datenrahmen bezeichnet .


    Netter Vergleich aller von ihnen mit einem Code-Snippet

    RDD vs DataFrame vs DataSet mit Code

    Quelle


    F: Können Sie die eine in die andere konvertieren wie RDD in DataFrame oder umgekehrt?

    Ja, beides ist möglich

    1. RDD zu DataFrame mit .toDF()

     val rowsRdd: RDD[Row] = sc.parallelize( Seq( Row("first", 2.0, 7.0), Row("second", 3.5, 2.5), Row("third", 7.0, 5.9) ) ) val df = spark.createDataFrame(rowsRdd).toDF("id", "val1", "val2") df.show() +------+----+----+ | id|val1|val2| +------+----+----+ | first| 2.0| 7.0| |second| 3.5| 2.5| | third| 7.0| 5.9| +------+----+----+ 

    Weitere Möglichkeiten: Konvertieren eines RDD-Objekts in Spark in Dataframe

    2. DataFrame / DataSet zu RDD mit .rdd() -Methode

     val rowsRdd: RDD[Row] = df.rdd() // DataFrame to RDD 

    Die meisten Antworten sind korrekt und möchten nur einen Punkt hinzufügen

    In Spark 2.0 werden die beiden APIs (DataFrame + DataSet) zu einer einzigen API zusammengefasst.

    “Vereinheitlichung von DataFrame und Dataset: In Scala und Java wurden DataFrame und Dataset vereinheitlicht, dh DataFrame ist nur ein Typ-Alias ​​für Dataset of Row. In Python und R ist DataFrame die Hauptprogrammierschnittstelle, da keine Typsicherheit besteht.”

    Datasets ähneln RDDs, verwenden jedoch statt der Java-Serialisierung oder Kryo einen speziellen Encoder, um Objekte zur Verarbeitung oder Übertragung über das Netzwerk zu serialisieren.

    Spark SQL unterstützt zwei verschiedene Methoden zum Konvertieren von vorhandenen RDDs in Datasets. Die erste Methode verwendet Reflektion, um das Schema einer RDD abzuleiten, die bestimmte Objekttypen enthält. Dieser reflexionsbasierte Ansatz führt zu präziseren Code und funktioniert gut, wenn Sie das Schema bereits beim Schreiben Ihrer Spark-Anwendung kennen.

    Die zweite Methode zum Erstellen von Datasets besteht in einer programmgesteuerten Schnittstelle, mit der Sie ein Schema erstellen und dann auf eine vorhandene RDD anwenden können. Während diese Methode ausführlicher ist, können Sie Datasets erstellen, wenn die Spalten und ihre Typen erst zur Laufzeit bekannt sind.

    Hier finden Sie RDD Tof Datenrahmen Konversation Antwort

    Wie konvertiert man das rdd-Objekt in den Dataframe in Spark

    Ein DataFrame entspricht einer Tabelle in RDBMS und kann auch auf ähnliche Weise wie die “nativen” verteilten Sammlungen in RDDs bearbeitet werden. Im Gegensatz zu RDDs behalten Dataframes das Schema im Auge und unterstützen verschiedene relationale Operationen, die zu einer optimierten Ausführung führen. Jedes DataFrame-Objekt stellt einen logischen Plan dar, aber aufgrund seiner “faulen” Art findet keine Ausführung statt, bis der Benutzer eine bestimmte “Ausgabeoperation” aufruft.

    Ein Dataframe ist ein RDD von Row-Objekten, die jeweils einen Datensatz darstellen. Ein Dataframe kennt auch das Schema (dh die Datenfelder) seiner Zeilen. Während Dataframes wie normale RDDs aussehen, speichern sie intern Daten auf effizientere Weise und nutzen dabei ihr Schema. Darüber hinaus bieten sie neue Operationen, die für RDDs nicht verfügbar sind, z. B. die Möglichkeit, SQL-Abfragen auszuführen. Datenrahmen können aus externen Datenquellen, aus den Ergebnissen von Abfragen oder aus regulären RDDs erstellt werden.

    Referenz: Zaharia M., et al. Funken lernen (O’Reilly, 2015)

    Einige Einblicke aus der Nutzungsperspektive, RDD vs Dataframe:

    1. RDDs sind erstaunlich! weil sie uns die Flexibilität geben, mit fast jeder Art von Daten umzugehen; unstrukturierte, semistrukturierte und strukturierte Daten. Da viele Daten nicht in einen DataFrame (sogar JSON) passen, können RDDs dazu verwendet werden, die Daten auf die Daten vorzubearbeiten, damit sie in einen Datenrahmen passen. RDDs sind die coredatenabstraktion in Spark.
    2. Nicht alle Transformationen, die auf RDD möglich sind, sind in DataFrames möglich, Beispiel subtract () ist für RDD vs except () ist für DataFrame.
    3. Da DataFrames wie eine relationale Tabelle sind, folgen sie strengen Regeln, wenn Sie Transformationen mit relationalen Mengen verwenden. Wenn Sie beispielsweise zwei Datenrahmen zusammenführen möchten, müssen beide dfs die gleiche Anzahl von Spalten und zugehörigen Spalten-Datentypen haben. Spaltennamen können unterschiedlich sein. Diese Regeln gelten nicht für RDDs. Hier ist ein gutes Tutorial , das diese Fakten erklärt.
    4. Es gibt performancessteigerungen bei der Verwendung von DataFrames, wie andere bereits ausführlich erläutert haben.
    5. Mit DataFrames müssen Sie nicht wie bei der Programmierung mit RDDs die arbiträre function übergeben.
    6. Sie benötigen SQLContext / HiveContext, um Dataframes zu programmieren, da sie im SparkSQL-Bereich von Spark Eco-System liegen. Für RDD benötigen Sie jedoch nur SparkContext / JavaSparkContext, die in Spark Core-Bibliotheken liegen.
    7. Sie können ein DF aus einer RDD erstellen, wenn Sie ein Schema dafür definieren können.
    8. Sie können auch ein df in rdd und rdd in df umwandeln.

    Ich hoffe, es hilft!

    Sie können RDDs mit strukturierten und unstrukturierten verwenden, wobei Dataframe / Dataset nur strukturierte und halbstrukturierte Daten verarbeiten kann (es hat ein korrektes Schema)

    Ein DataFrame ist eine RDD mit einem Schema. Sie können es sich als eine relationale databasetabelle vorstellen, in der jede Spalte einen Namen und einen bekannten Typ hat. Die Stärke von DataFrames liegt in der Tatsache, dass Spark beim Erstellen eines Datenframes aus einem strukturierten Dataset (Json, Parquet ..) ein Schema ableiten kann, indem es den gesamten (Json, Parquet ..) -Datensatz übergibt geladen werden. Dann kann Spark bei der Berechnung des Ausführungsplans das Schema verwenden und wesentlich bessere Berechnungsoptimierungen vornehmen. Beachten Sie, dass DataFrame vor Spark v1.3.0 SchemaRDD aufgerufen wurde