Ich frage mich nur, was der Unterschied zwischen einem RDD
und DataFrame
(Spark 2.0.0 DataFrame ist nur ein Typ-Alias für Dataset[Row]
) in Apache Spark ist.
Können Sie eine in die andere konvertieren?
Ich frage mich nur, was der Unterschied zwischen einem RDD
und DataFrame
(Spark 2.0.0 DataFrame ist nur ein Typ-Alias für Dataset[Row]
) in Apache Spark ist.
Können Sie eine in die andere konvertieren?
Antworten:
A 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 für eine Variable enthält und jede Zeile einen Fall enthält.
Daher verfügt a DataFrame
aufgrund seines Tabellenformats über zusätzliche Metadaten, sodass Spark bestimmte Optimierungen für die abgeschlossene Abfrage ausführen kann.
Ein RDD
auf der anderen Seite, ist bloß ein R esilient D istributed D ataset dass mehr von einer Blackbox von Daten ist , die nicht wie die Operationen optimiert werden können , die gegen sie durchgeführt werden können, ist nicht so eingeschränkt.
Sie können jedoch von einem Datenrahmen zu einem gehen RDD
über seine rdd
Methode, und man kann von einem gehen RDD
zu einem DataFrame
(wenn die RDD in tabellarischer Form ist) über das toDF
Verfahren
Im Allgemeinen wird DataFrame
aufgrund der integrierten Abfrageoptimierung empfohlen, nach Möglichkeit eine zu verwenden .
Das erste,
DataFrame
woraus man sich entwickelt hatSchemaRDD
.
Ja .. Konvertierung zwischen Dataframe
und RDD
ist absolut möglich.
Im Folgenden finden Sie einige Beispielcode-Schnipsel.
df.rdd
ist RDD[Row]
Im Folgenden finden Sie einige Optionen zum Erstellen eines Datenrahmens.
1) yourrddOffrow.toDF
konvertiert zu DataFrame
.
2) Verwendung createDataFrame
des SQL-Kontexts
val df = spark.createDataFrame(rddOfRow, schema)
Wobei das Schema aus einigen der folgenden Optionen stammen kann, wie durch einen netten SO-Beitrag beschrieben.
Aus der Scala-Fallklasse und der Scala-Reflection-APIimport 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 erstellt werdenStructField
val schema = new StructType() .add(StructField("id", StringType, true)) .add(StructField("col1", DoubleType, true)) .add(StructField("col2", DoubleType, true)) etc...
Tatsächlich gibt es jetzt 3 Apache Spark-APIs.
RDD
API:Die
RDD
API (Resilient Distributed Dataset) befindet sich seit der Version 1.0 in Spark.Die
RDD
API bietet viele Transformationsmethoden wiemap
(),filter
() undreduce
() zum Durchführen von Berechnungen für die Daten. Jede dieser Methoden führt zu einer neuenRDD
Darstellung der transformierten Daten. 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 sindcollect
() undsaveAsObjectFile
().
RDD Beispiel:
rdd.filter(_.age > 21) // transformation
.map(_.last)// transformation
.saveAsObjectFile("under21.bin") // action
Beispiel: Filtern nach Attribut mit RDD
rdd.filter(_.age > 21)
DataFrame
APISpark 1.3 hat
DataFrame
im Rahmen der Project Tungsten-Initiative eine neue API eingeführt , mit der die Leistung und Skalierbarkeit von Spark verbessert werden soll. DieDataFrame
API führt das Konzept eines Schemas zur Beschreibung der Daten ein, sodass Spark das Schema verwalten und nur Daten zwischen Knoten übertragen kann. Dies ist wesentlich effizienter als bei Verwendung der Java-Serialisierung.Die
DataFrame
API unterscheidet sich grundlegend von derRDD
API, da es sich um eine API zum Erstellen eines relationalen Abfrageplans handelt, den das Catalyst-Optimierungsprogramm von Spark dann ausführen kann. Die API ist für Entwickler selbstverständlich, die mit dem Erstellen von Abfrageplänen vertraut sind
Beispiel SQL-Stil:
df.filter("age > 21");
Einschränkungen: Da der Code namentlich auf Datenattribute verweist, kann der Compiler keine Fehler abfangen. Wenn Attributnamen falsch sind, wird der Fehler erst zur Laufzeit erkannt, wenn der Abfrageplan erstellt wird.
Ein weiterer Nachteil der DataFrame
API ist, dass sie sehr scala-zentriert ist und zwar Java unterstützt, die Unterstützung jedoch begrenzt ist.
Wenn Sie beispielsweise DataFrame
ein RDD
Objekt aus vorhandenen Java-Objekten erstellen , kann der Catalyst-Optimierer von Spark nicht auf das Schema schließen und geht davon aus, dass Objekte im DataFrame die scala.Product
Schnittstelle implementieren . Scala case class
arbeitet sofort, weil sie diese Schnittstelle implementieren.
Dataset
APIDie
Dataset
API, die in Spark 1.6 als API-Vorschau veröffentlicht wurde, soll das Beste aus beiden Welten bieten. Der bekannte objektorientierte Programmierstil und die Typensicherheit zur Kompilierungszeit derRDD
API, jedoch mit den Leistungsvorteilen des Catalyst-Abfrageoptimierers. Datensätze verwenden auch denselben effizienten Off-Heap-Speichermechanismus wie dieDataFrame
API.Wenn es um die Serialisierung von Daten geht, hat die
Dataset
API das Konzept von Encodern, die zwischen JVM-Darstellungen (Objekten) und dem internen Binärformat von Spark übersetzen. Spark verfügt über integrierte Encoder, die insofern sehr fortschrittlich sind, als sie Bytecode generieren, um mit Off-Heap-Daten zu interagieren und bei Bedarf Zugriff auf einzelne Attribute zu ermöglichen, ohne ein gesamtes Objekt de-serialisieren zu müssen. Spark bietet noch keine API zum Implementieren von benutzerdefinierten Encodern, dies ist jedoch für eine zukünftige Version geplant.Darüber hinaus ist die
Dataset
API so konzipiert, dass sie sowohl mit Java als auch mit Scala gleich gut funktioniert. Bei der Arbeit mit Java-Objekten ist es wichtig, dass sie vollständig Bean-kompatibel sind.
Beispiel für einen Dataset
API-SQL-Stil:
dataset.filter(_.age < 21);
Bewertungen diff. zwischen DataFrame
& DataSet
:
Fluss auf katalanischer Ebene. (Entmystifizierung der Präsentation von DataFrame und Dataset vom Spark Summit)
Lesen Sie weiter ... Artikel über Databricks - Eine Geschichte von drei Apache Spark-APIs: RDDs im Vergleich zu DataFrames und Datasets
df.filter("age > 21");
das nur zur Laufzeit ausgewertet / analysiert werden kann. seit seiner Zeichenfolge. Bei Datensätzen sind Datensätze Bean-konform. Alter ist also Bohneneigentum. Wenn in Ihrer Bohne keine Alterseigenschaft vorhanden ist, werden Sie dies früh in der Kompilierungszeit (dh dataset.filter(_.age < 21);
) erfahren . Analysefehler können in Bewertungsfehler umbenannt werden.
Apache Spark bietet drei Arten von APIs
Hier ist der API-Vergleich zwischen RDD, Dataframe und Dataset.
Die Hauptabstraktion, die Spark bereitstellt, ist ein ausfallsicheres verteiltes Dataset (RDD), eine Sammlung von Elementen, die auf die Knoten des Clusters verteilt sind und parallel bearbeitet werden können.
Verteilte Sammlung:
RDD verwendet MapReduce-Operationen, die häufig für die Verarbeitung und Generierung großer Datenmengen mit einem parallelen, verteilten Algorithmus in einem Cluster verwendet werden. Benutzer können parallele Berechnungen mit einer Reihe von übergeordneten Operatoren schreiben, ohne sich um die Arbeitsverteilung und die Fehlertoleranz kümmern zu müssen.
Unveränderlich: RDDs, die aus einer Sammlung partitionierter Datensätze bestehen. Eine Partition ist eine grundlegende Einheit der Parallelität in einer RDD, und jede Partition ist eine logische Aufteilung von Daten, die unveränderlich ist und durch einige Transformationen auf vorhandenen Partitionen erstellt wird. Die Unveränderlichkeit trägt dazu bei, Konsistenz bei den Berechnungen zu erreichen.
Fehlertolerant: Wenn wir eine RDD-Partition verlieren, können wir die Transformation auf dieser Partition in der Linie wiedergeben, um dieselbe Berechnung zu erzielen, anstatt die Datenreplikation über mehrere Knoten hinweg durchzuführen. Diese Eigenschaft ist der größte Vorteil von RDD, da sie spart viel Aufwand bei der Datenverwaltung und -replikation und damit schnellere Berechnungen.
Faule Bewertungen: Alle Transformationen in Spark sind insofern faul, als sie ihre Ergebnisse nicht sofort berechnen. Stattdessen erinnern sie sich nur an die Transformationen, die auf einen Basisdatensatz angewendet wurden. Die Transformationen werden nur berechnet, wenn für eine Aktion ein Ergebnis an das Treiberprogramm zurückgegeben werden muss.
Funktionale Transformationen: RDDs unterstützen zwei Arten von Operationen: Transformationen, die aus einem vorhandenen Dataset ein neues Dataset erstellen, und Aktionen, die nach dem Ausführen einer Berechnung für das Dataset einen Wert an das Treiberprogramm zurückgeben.
Datenverarbeitungsformate:
Es kann sowohl strukturierte als auch unstrukturierte Daten einfach und effizient verarbeiten.
Unterstützte Programmiersprachen: Die
RDD-API ist in Java, Scala, Python und R verfügbar.
Keine eingebaute Optimierungs-Engine: Bei der Arbeit mit strukturierten Daten können RDDs die fortschrittlichen Optimierer von Spark, einschließlich Katalysator-Optimierer und Wolfram-Ausführungs-Engine, nicht nutzen. Entwickler müssen jedes RDD basierend auf seinen Attributen optimieren.
Umgang mit strukturierten Daten: Im Gegensatz zu Dataframe und Datasets leiten RDDs nicht auf das Schema der aufgenommenen Daten ab und müssen vom Benutzer angegeben werden.
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 konzeptionell einer Tabelle in einer relationalen Datenbank oder einem R / Python-Datenrahmen. Neben Dataframe führte Spark auch den Katalysatoroptimierer ein, der erweiterte Programmierfunktionen nutzt, um einen erweiterbaren Abfrageoptimierer zu erstellen.
Verteilte Sammlung von Zeilenobjekten : Ein DataFrame ist eine verteilte Sammlung von Daten, die in benannten Spalten organisiert sind. Es entspricht konzeptionell einer Tabelle in einer relationalen Datenbank, bietet jedoch umfassendere Optimierungen.
Datenverarbeitung: Verarbeitung strukturierter und unstrukturierter Datenformate (Avro, CSV, elastische Suche und Cassandra) und Speichersysteme (HDFS, HIVE-Tabellen, MySQL usw.). Es kann aus all diesen verschiedenen Datenquellen lesen und schreiben.
Optimierung mit dem Katalysatoroptimierer: Er unterstützt sowohl SQL-Abfragen als auch die DataFrame-API. Datenrahmen verwenden Katalysatorbaum-Transformations-Framework 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 unveränderte Hive-Abfragen in Ihren vorhandenen Hive-Lagern ausführen. Es verwendet das Hive-Frontend und den MetaStore erneut und bietet Ihnen vollständige Kompatibilität mit vorhandenen Hive-Daten, Abfragen und UDFs.
Wolfram: Wolfram bietet ein Backend für die physische Ausführung, das den Speicher explizit verwaltet und dynamisch Bytecode für die Ausdrucksbewertung generiert.
Unterstützte Programmiersprachen: Die
Dataframe-API ist in Java, Scala, Python und R verfügbar.
Beispiel:
case class Person(name : String , age : Int)
val dataframe = sqlContext.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.
Beispiel:
case class Person(name : String , age : Int)
val personRDD = sc.makeRDD(Seq(Person("A",10),Person("B",20)))
val personDF = sqlContext.createDataframe(personRDD)
personDF.rdd // returns RDD[Row] , does not returns RDD[Person]
Die Dataset-API ist eine Erweiterung von DataFrames, die eine typsichere, objektorientierte Programmierschnittstelle bietet. Es handelt sich um eine stark typisierte, unveränderliche Sammlung von Objekten, die einem relationalen Schema zugeordnet sind.
Im Kern des Datensatzes ist API ein neues Konzept, das als Encoder bezeichnet wird und für die Konvertierung zwischen JVM-Objekten und die tabellarische Darstellung verantwortlich ist. Die tabellarische Darstellung wird im Spark-internen Wolfram-Binärformat gespeichert, was Operationen an serialisierten Daten und eine verbesserte Speichernutzung ermöglicht. 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.
Bietet das Beste aus RDD und Dataframe: RDD (funktionale Programmierung, typsicher), DataFrame (relationales Modell, Abfrageoptimierung, Wolframausführung, Sortieren und Mischen)
Encoder: Mit der 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 mit unstrukturierten Daten arbeiten können.
Unterstützte Programmiersprachen: Die Datasets-API ist derzeit nur in Scala und Java verfügbar. Python und R werden derzeit in Version 1.6 nicht unterstützt. Die Python-Unterstützung ist für Version 2.0 vorgesehen.
Typensicherheit : Die Datasets-API bietet Sicherheit zur Kompilierungszeit, die in Dataframes nicht verfügbar war. Im folgenden Beispiel sehen wir, wie Dataset Domänenobjekte mit kompilierten Lambda-Funktionen bearbeiten kann.
Beispiel:
case class Person(name : String , age : Int)
val personRDD = sc.makeRDD(Seq(Person("A",10),Person("B",20)))
val personDF = sqlContext.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]
Beispiel:
ds.select(col("name").as[String], $"age".as[Int]).collect()
Keine Unterstützung für Python und R: Ab Version 1.6 unterstützen Datasets nur noch Scala und Java. Die Python-Unterstützung wird in Spark 2.0 eingeführt.
Die Datasets-API bietet mehrere Vorteile gegenüber der vorhandenen RDD- und Dataframe-API mit besserer Typensicherheit und funktionaler Programmierung. Mit der Herausforderung der Typumwandlungsanforderungen in der API würden Sie immer noch nicht die erforderliche Typensicherheit erreichen und Ihren Code brüchig machen.
Dataset
ist nicht LINQ und der Lambda-Ausdruck kann nicht als Ausdrucksbaum interpretiert werden. Daher gibt es Black Boxes, und Sie verlieren so ziemlich alle (wenn nicht alle) Optimierungsvorteile. Nur eine kleine Teilmenge möglicher Nachteile: Spark 2.0 Dataset vs DataFrame . Nur um etwas zu wiederholen, das ich mehrmals angegeben habe - im Allgemeinen ist eine End-to-End-Typprüfung mit der Dataset
API nicht möglich . Joins sind nur das bekannteste Beispiel.
RDD
RDD
ist eine fehlertolerante Sammlung von Elementen, die parallel bearbeitet werden können.
DataFrame
DataFrame
ist ein Datensatz, der in benannten Spalten organisiert ist. Es entspricht konzeptionell einer Tabelle in einer relationalen Datenbank oder einem Datenrahmen in R / Python, bietet jedoch umfassendere Optimierungen .
Dataset
Dataset
ist eine verteilte Sammlung von Daten. Dataset ist eine neue Schnittstelle, die in Spark 1.6 hinzugefügt wurde und die Vorteile von RDDs (starke Typisierung, Fähigkeit zur Verwendung leistungsstarker Lambda-Funktionen) mit den Vorteilen der optimierten Ausführungs-Engine von Spark SQL bietet .
Hinweis:
Dataset of Rows (
Dataset[Row]
) in Scala / Java wird häufig als DataFrames bezeichnet .
Nice comparison of all of them with a code snippet.
F: Können Sie eines wie RDD in DataFrame konvertieren oder umgekehrt?
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 Sie ein RDD-Objekt in Spark in Dataframe
2. DataFrame
/ DataSet
um RDD
mit .rdd()
Verfahren
val rowsRdd: RDD[Row] = df.rdd() // DataFrame to RDD
Weil DataFrame
es schwach typisiert ist und Entwickler nicht die Vorteile des Typsystems nutzen können. Angenommen, Sie möchten etwas aus SQL lesen und eine Aggregation darauf ausführen:
val people = sqlContext.read.parquet("...")
val department = sqlContext.read.parquet("...")
people.filter("age > 30")
.join(department, people("deptId") === department("id"))
.groupBy(department("name"), "gender")
.agg(avg(people("salary")), max(people("age")))
Wenn Sie sagen people("deptId")
, dass Sie ein Int
oder Long
ein Column
Objekt nicht zurückerhalten , erhalten Sie ein Objekt zurück, an dem Sie arbeiten müssen. In Sprachen mit umfangreichen Typsystemen wie Scala verlieren Sie am Ende die gesamte Typensicherheit, was die Anzahl der Laufzeitfehler für Dinge erhöht, die beim Kompilieren entdeckt werden könnten.
Im Gegenteil, DataSet[T]
wird getippt. wenn Sie das tun:
val people: People = val people = sqlContext.read.parquet("...").as[People]
Sie erhalten tatsächlich ein People
Objekt zurück, bei dem deptId
es sich um einen tatsächlichen Integraltyp und nicht um einen Spaltentyp handelt, und nutzen so das Typsystem.
Ab Spark 2.0 werden die DataFrame- und DataSet-APIs vereinheitlicht, wobei DataFrame
ein Typalias für verwendet wird DataSet[Row]
.
DataFrame
war, zu vermeiden, dass API-Änderungen beschädigt werden. Jedenfalls wollte ich nur darauf hinweisen. Danke für die Bearbeitung und das Upvote von mir.
Es ist einfach RDD
eine Kernkomponente, aber DataFrame
eine API, die in Spark 1.30 eingeführt wurde.
Sammlung von Datenpartitionen aufgerufen RDD
. Diese RDD
müssen nur wenigen Eigenschaften folgen, wie z.
Hier RDD
ist entweder strukturiert oder unstrukturiert.
DataFrame
ist eine API, die in Scala, Java, Python und R verfügbar ist. Sie ermöglicht die Verarbeitung aller Arten von strukturierten und halbstrukturierten Daten. Zum Definieren DataFrame
wird eine Sammlung verteilter Daten aufgerufen, die in benannten Spalten organisiert sind DataFrame
. Sie können die RDDs
in der leicht optimieren DataFrame
. Mit können Sie JSON-Daten, Parkettdaten und HiveQL-Daten gleichzeitig verarbeiten DataFrame
.
val sampleRDD = sqlContext.jsonFile("hdfs://localhost:9000/jsondata.json")
val sample_DF = sampleRDD.toDF()
Hier gilt Sample_DF als DataFrame
. sampleRDD
wird (Rohdaten) aufgerufen RDD
.
Die meisten Antworten sind richtig. Ich möchte hier nur einen Punkt hinzufügen
In Spark 2.0 werden die beiden APIs (DataFrame + DataSet) zu einer einzigen API zusammengefasst.
"Vereinheitlichen von DataFrame und Dataset: In Scala und Java wurden DataFrame und Dataset vereinheitlicht, dh DataFrame ist nur ein Typalias für Dataset of Row. In Python und R ist DataFrame aufgrund der mangelnden Typensicherheit die Hauptprogrammierschnittstelle."
Datensätze ähneln RDDs, verwenden jedoch anstelle der Java-Serialisierung oder von Kryo einen speziellen Encoder, um die Objekte für die Verarbeitung oder Übertragung über das Netzwerk zu serialisieren.
Spark SQL unterstützt zwei verschiedene Methoden zum Konvertieren vorhandener RDDs in Datasets. Die erste Methode verwendet Reflexion, um auf das Schema einer RDD zu schließen, die bestimmte Objekttypen enthält. Dieser auf Reflexion basierende Ansatz führt zu präziserem Code und funktioniert gut, wenn Sie das Schema bereits beim Schreiben Ihrer Spark-Anwendung kennen.
Die zweite Methode zum Erstellen von Datensätzen besteht in einer programmgesteuerten Schnittstelle, mit der Sie ein Schema erstellen und dann auf eine vorhandene RDD anwenden können. Diese Methode ist zwar ausführlicher, ermöglicht es Ihnen jedoch, Datensätze zu erstellen, wenn die Spalten und ihre Typen erst zur Laufzeit bekannt sind.
Hier finden Sie RDD für die Antwort auf Datenrahmenkonversationen
So konvertieren Sie ein rdd-Objekt in einen Datenrahmen in Spark
Ein DataFrame entspricht einer Tabelle in RDBMS und kann auf ähnliche Weise wie die "nativen" verteilten Sammlungen in RDDs bearbeitet werden. Im Gegensatz zu RDDs verfolgen Dataframes das Schema und unterstützen verschiedene relationale Vorgänge, die zu einer optimierten Ausführung führen. Jedes DataFrame-Objekt stellt einen logischen Plan dar. Aufgrund seiner "Faulheit" erfolgt jedoch keine Ausführung, bis der Benutzer eine bestimmte "Ausgabeoperation" aufruft.
Ich hoffe, es hilft!
Ein Datenrahmen ist eine RDD von Zeilenobjekten, die jeweils einen Datensatz darstellen. Ein Datenrahmen kennt auch das Schema (dh Datenfelder) seiner Zeilen. Während Dataframes wie normale RDDs aussehen, speichern sie Daten intern effizienter und nutzen dabei ihr Schema. Darüber hinaus bieten sie neue Vorgänge, die auf 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. Lernfunken (O'Reilly, 2015)
Spark RDD (resilient distributed dataset)
::
RDD ist die zentrale Datenabstraktions-API und seit der ersten Veröffentlichung von Spark (Spark 1.0) verfügbar. Es ist eine untergeordnete API zum Bearbeiten der verteilten Datenerfassung. Die RDD-APIs stellen einige äußerst nützliche Methoden bereit, mit denen die zugrunde liegende physische Datenstruktur sehr genau kontrolliert werden kann. Es ist eine unveränderliche (schreibgeschützte) Sammlung partitionierter Daten, die auf verschiedenen Computern verteilt sind. RDD ermöglicht die In-Memory-Berechnung in großen Clustern, um die Verarbeitung großer Datenmengen fehlertolerant zu beschleunigen. Um die Fehlertoleranz zu aktivieren, verwendet RDD DAG (Directed Acyclic Graph), das aus einer Reihe von Eckpunkten und Kanten besteht. Die Eckpunkte und Kanten in der DAG repräsentieren die RDD bzw. die Operation, die auf diese RDD angewendet werden soll. Die in RDD definierten Transformationen sind verzögert und werden nur ausgeführt, wenn eine Aktion aufgerufen wird
Spark DataFrame
::
In Spark 1.3 wurden zwei neue Datenabstraktions-APIs eingeführt - DataFrame und DataSet. Die DataFrame-APIs organisieren die Daten in benannten Spalten wie eine Tabelle in einer relationalen Datenbank. Es ermöglicht Programmierern, ein Schema für eine verteilte Sammlung von Daten zu definieren. Jede Zeile in einem DataFrame ist vom Typ Objektzeile. Wie eine SQL-Tabelle muss jede Spalte die gleiche Anzahl von Zeilen in einem DataFrame haben. Kurz gesagt, DataFrame ist ein träge ausgewerteter Plan, der angibt, welche Vorgänge für die verteilte Erfassung der Daten ausgeführt werden müssen. DataFrame ist auch eine unveränderliche Sammlung.
Spark DataSet
::
Als Erweiterung der DataFrame-APIs führte Spark 1.3 auch DataSet-APIs ein, die in Spark eine streng typisierte und objektorientierte Programmierschnittstelle bieten. Es ist eine unveränderliche, typsichere Sammlung verteilter Daten. Wie DataFrame verwenden auch DataSet-APIs die Catalyst-Engine, um die Ausführungsoptimierung zu ermöglichen. DataSet ist eine Erweiterung der DataFrame-APIs.
Other Differences
- -
Ein DataFrame ist eine RDD mit einem Schema. Sie können es sich als relationale Datenbanktabelle vorstellen, in der jede Spalte einen Namen und einen bekannten Typ hat. Die Leistungsfähigkeit von DataFrames beruht auf der Tatsache, dass Spark beim Erstellen eines DataFrames aus einem strukturierten Dataset (Json, Parquet ..) auf ein Schema schließen kann, indem es das gesamte Dataset (Json, Parquet ..) durchläuft geladen werden. Bei der Berechnung des Ausführungsplans kann Spark dann das Schema verwenden und wesentlich bessere Berechnungsoptimierungen durchführen. Beachten Sie, dass Datenrahmen SchemaRDD vor Funken v1.3.0 genannt wurde
Spark RDD -
Ein RDD steht für Resilient Distributed Datasets. Es handelt sich um eine schreibgeschützte Partitionssammlung von Datensätzen. RDD ist die grundlegende Datenstruktur von Spark. Es ermöglicht einem Programmierer, speicherinterne Berechnungen in großen Clustern fehlertolerant durchzuführen. Beschleunigen Sie also die Aufgabe.
Spark Dataframe -
Im Gegensatz zu einem RDD sind Daten in benannten Spalten organisiert. Zum Beispiel eine Tabelle in einer relationalen Datenbank. Es ist eine unveränderliche verteilte Sammlung von Daten. Mit DataFrame in Spark können Entwickler einer verteilten Datensammlung eine Struktur auferlegen und so eine Abstraktion auf höherer Ebene ermöglichen.
Spark-Datensatz -
Datensätze in Apache Spark sind eine Erweiterung der DataFrame-API, die eine typsichere, objektorientierte Programmierschnittstelle bietet. Dataset nutzt den Catalyst-Optimierer von Spark, indem Ausdrücke und Datenfelder einem Abfrageplaner zur Verfügung gestellt werden.
Alle guten Antworten und die Verwendung jeder API haben einige Nachteile. Der Datensatz wurde als Super-API entwickelt, um viele Probleme zu lösen. Oft funktioniert RDD jedoch immer noch am besten, wenn Sie Ihre Daten verstehen und wenn der Verarbeitungsalgorithmus für viele Aufgaben in einem Durchgang zu großen Datenmengen optimiert ist, dann scheint RDD die beste Option zu sein.
Die Aggregation mithilfe der Dataset-API verbraucht immer noch Speicher und wird mit der Zeit besser.