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?
quelle
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?
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 .
Ja .. Konvertierung zwischen
Dataframe
undRDD
ist absolut möglich.Im Folgenden finden Sie einige Beispielcode-Schnipsel.
df.rdd
istRDD[Row]
Im Folgenden finden Sie einige Optionen zum Erstellen eines Datenrahmens.
1)
yourrddOffrow.toDF
konvertiert zuDataFrame
.2) Verwendung
createDataFrame
des SQL-Kontextsval df = spark.createDataFrame(rddOfRow, schema)
Tatsächlich gibt es jetzt 3 Apache Spark-APIs.
RDD
API:RDD Beispiel:
Beispiel: Filtern nach Attribut mit RDD
DataFrame
APIBeispiel 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
einRDD
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 diescala.Product
Schnittstelle implementieren . Scalacase class
arbeitet sofort, weil sie diese Schnittstelle implementieren.Dataset
APIBeispiel für einen
Dataset
API-SQL-Stil: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
quelle
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 (dhdataset.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.
RDD
RDD-Funktionen: -
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.
RDD-Einschränkungen: -
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.
Datenrahmen
Spark hat Dataframes in Spark 1.3 eingeführt. Dataframe überwindet die wichtigsten Herausforderungen, die RDDs hatten.
Datenrahmenfunktionen: -
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:
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.
Datenrahmenbeschränkungen: -
Beispiel:
Dies ist besonders dann eine Herausforderung, wenn Sie mit mehreren Transformations- und Aggregationsschritten arbeiten.
Beispiel:
Datensatz-API
Datensatzfunktionen: -
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:
API-Einschränkung für Datensätze: -
Beispiel:
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.
quelle
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 derDataset
API nicht möglich . Joins sind nur das bekannteste Beispiel.Alle (RDD, DataFrame und DataSet) in einem Bild.
Bildnachweis
RDD
DataFrame
Dataset
Nice comparison of all of them with a code snippet.
Quelle
Ja, beides ist möglich
1.
RDD
zuDataFrame
mit.toDF()
Weitere Möglichkeiten: Konvertieren Sie ein RDD-Objekt in Spark in Dataframe
2.
DataFrame
/DataSet
umRDD
mit.rdd()
Verfahrenquelle
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:Wenn Sie sagen
people("deptId")
, dass Sie einInt
oderLong
einColumn
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:Sie erhalten tatsächlich ein
People
Objekt zurück, bei demdeptId
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 wirdDataSet[Row]
.quelle
Dataframe
ist nur ein Alias fürDataset[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, aberDataFrame
eine API, die in Spark 1.30 eingeführt wurde.RDD
Sammlung von Datenpartitionen aufgerufen
RDD
. DieseRDD
müssen nur wenigen Eigenschaften folgen, wie z.Hier
RDD
ist entweder strukturiert oder unstrukturiert.DataFrame
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 DefinierenDataFrame
wird eine Sammlung verteilter Daten aufgerufen, die in benannten Spalten organisiert sindDataFrame
. Sie können dieRDDs
in der leicht optimierenDataFrame
. Mit können Sie JSON-Daten, Parkettdaten und HiveQL-Daten gleichzeitig verarbeitenDataFrame
.Hier gilt Sample_DF als
DataFrame
.sampleRDD
wird (Rohdaten) aufgerufenRDD
.quelle
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
quelle
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.
quelle
Einige Einblicke aus Nutzungssicht, RDD vs DataFrame:
Ich hoffe, es hilft!
quelle
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)
quelle
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
- -quelle
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
quelle
Apache Spark - RDD, DataFrame und DataSet
Spark RDD -
Spark Dataframe -
Spark-Datensatz -
quelle
Sie können RDDs mit strukturierten und unstrukturierten Daten verwenden, wobei Dataframe / Dataset nur strukturierte und halbstrukturierte Daten verarbeiten kann (es hat das richtige Schema).
quelle
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.
quelle