Unterschied zwischen DataFrame, Dataset und RDD in Spark


Antworten:


232

A DataFrameist 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 DataFrameaufgrund seines Tabellenformats über zusätzliche Metadaten, sodass Spark bestimmte Optimierungen für die abgeschlossene Abfrage ausführen kann.

Ein RDDauf 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 rddMethode, und man kann von einem gehen RDDzu einem DataFrame(wenn die RDD in tabellarischer Form ist) über das toDFVerfahren

Im Allgemeinen wird DataFrameaufgrund der integrierten Abfrageoptimierung empfohlen, nach Möglichkeit eine zu verwenden .


6
Die Antwort enthält keine Erklärung zu Datensätzen. Gemäß Spark-The Definitive Guide ist ein Datensatz eine typsichere strukturierte API. So können Sie den Typ Ihres Schemas im Voraus angeben.
Chintan Pandya

3
Vielen Dank - der ursprüngliche Titel und die Beschreibung wurden gut nach den ursprünglichen Fragen (die keine
Datensätze enthielten

219

Das erste, DataFrameworaus man sich entwickelt hat SchemaRDD.

depreated Methode zuSchemaRDD

Ja .. Konvertierung zwischen Dataframeund RDDist 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.toDFkonvertiert zu DataFrame.

  • 2) Verwendung createDataFramedes 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-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 StructTypeund erstellt werdenStructField

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.

Geben Sie hier die Bildbeschreibung ein

  1. RDD API:

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

Die RDDAPI bietet viele Transformationsmethoden wie map(), filter() und reduce() zum Durchführen von Berechnungen für die Daten. Jede dieser Methoden führt zu einer neuen RDDDarstellung 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 sind collect() und saveAsObjectFile().

RDD Beispiel:

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

Beispiel: Filtern nach Attribut mit RDD

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

Spark 1.3 hat DataFrameim Rahmen der Project Tungsten-Initiative eine neue API eingeführt , mit der die Leistung und Skalierbarkeit von Spark verbessert werden soll. Die DataFrameAPI 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 DataFrameAPI unterscheidet sich grundlegend von der RDDAPI, 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 DataFrameAPI ist, dass sie sehr scala-zentriert ist und zwar Java unterstützt, die Unterstützung jedoch begrenzt ist.

Wenn Sie beispielsweise DataFrameein RDDObjekt 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.ProductSchnittstelle implementieren . Scala case classarbeitet sofort, weil sie diese Schnittstelle implementieren.

  1. Dataset API

Die DatasetAPI, 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 der RDDAPI, jedoch mit den Leistungsvorteilen des Catalyst-Abfrageoptimierers. Datensätze verwenden auch denselben effizienten Off-Heap-Speichermechanismus wie die DataFrameAPI.

Wenn es um die Serialisierung von Daten geht, hat die DatasetAPI 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 DatasetAPI 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 DatasetAPI-SQL-Stil:

dataset.filter(_.age < 21);

Bewertungen diff. zwischen DataFrame& DataSet: Geben Sie hier die Bildbeschreibung ein

Fluss auf katalanischer Ebene. (Entmystifizierung der Präsentation von DataFrame und Dataset vom Spark Summit) Geben Sie hier die Bildbeschreibung ein

Lesen Sie weiter ... Artikel über Databricks - Eine Geschichte von drei Apache Spark-APIs: RDDs im Vergleich zu DataFrames und Datasets


Was ist ein stark typisierter Strukturdatensatz? Wie unterscheidet es sich von DataFrame?
Arvind Kumar

Welche Art von Analysefehlern werden in Datensätzen behandelt?
Neeleshkumar S

5
@ neelesh-srinivasan: Nehmen Sie ein Beispiel in der Datenrahmensyntax, 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.
Ram Ghadiyaram

@NeeleshSrinivasan: Für weitere Informationen und Details siehe Apache-Spark-API-Vergleich
Ram Ghadiyaram

Das erste Bild ist irreführend. Datensätze sind nicht verfügbar in Python
Yeikel

135

Apache Spark bietet drei Arten von APIs

  1. RDD
  2. DataFrame
  3. Datensatz

Vergleichen von RDD-, Dataframe- und Dataset-APIs

Hier ist der API-Vergleich zwischen RDD, Dataframe und Dataset.

RDD

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.

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.

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.

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:

     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.

Datenrahmenbeschränkungen: -

  • Sicherheit vom Typ der Kompilierungszeit: Wie bereits erwähnt, unterstützt die Dataframe-API die Sicherheit der Kompilierungszeit nicht, sodass Sie keine Daten bearbeiten können, wenn die Struktur nicht bekannt ist. Das folgende Beispiel funktioniert während der Kompilierungszeit. Bei der Ausführung dieses Codes wird jedoch eine Laufzeitausnahme angezeigt.

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.

  • Domänenobjekt (verlorenes Domänenobjekt) kann nicht bearbeitet werden : Nachdem Sie ein Domänenobjekt in einen Datenrahmen umgewandelt haben, können Sie es nicht mehr daraus neu generieren. Im folgenden Beispiel wird nach dem Erstellen von personDF aus personRDD die ursprüngliche RDD der Person-Klasse (RDD [Person]) nicht wiederhergestellt.

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]

Datensatz-API

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.

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:

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]
  • Interoperabel: Mit Datasets können Sie Ihre vorhandenen RDDs und Dataframes einfach in Datasets ohne Boilerplate-Code konvertieren.

API-Einschränkung für Datensätze: -

  • Typumwandlung in String erforderlich: Zum Abfragen der Daten aus Datasets müssen derzeit die Felder in der Klasse als String angegeben werden. Sobald wir die Daten abgefragt haben, müssen wir die Spalte in den erforderlichen Datentyp umwandeln. Wenn wir dagegen die Kartenoperation für Datensätze verwenden, wird das Catalyst-Optimierungsprogramm nicht verwendet.

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.


2
Von spark.apache.org/docs/latest/… ist DataFrame in der Scala-API einfach ein Typalias von Dataset [Row].
Dean Chen

Ist es also in Ordnung zu sagen, dass wir mit dem Datensatz die Typensicherheit gewinnen und den Optimierer verlieren?
Khoa

@BlueSky Sie erhalten die Typensicherheit und haben noch den Optimierer
Gabber

@AmitDubey Das stimmt einfach nicht. Datasetist 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 DatasetAPI nicht möglich . Joins sind nur das bekannteste Beispiel.
Null 323

52

Alle (RDD, DataFrame und DataSet) in einem Bild.

RDD vs DataFrame vs DataSet

Bildnachweis

RDD

RDD ist eine fehlertolerante Sammlung von Elementen, die parallel bearbeitet werden können.

DataFrame

DataFrameist 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

Datasetist 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.

RDD vs DataFrame vs DataSet mit Code

Quelle


F: Können Sie eines wie RDD in DataFrame konvertieren oder umgekehrt?

Ja, beides ist möglich

1. RDDzu DataFramemit.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/ DataSetum RDDmit .rdd()Verfahren

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

27

Weil DataFramees 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 Intoder Longein ColumnObjekt 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 PeopleObjekt zurück, bei dem deptIdes 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 DataFrameein Typalias für verwendet wird DataSet[Row].


5
Um genau zu sein, wie für Spark 2.0 Dataframe ist nur ein Alias fürDataset[Row]
zero323

1
@ zero323 Ja, aber das ist immer noch schwach getippt, das wollte ich vermitteln.
Yuval Itzchakov

Ja, aber es geht mehr um gespeicherte Werte als um einen Container. Sogar in 1.6 waren diese beiden technisch identisch und der Hauptgrund für die Trennung DataFramewar, zu vermeiden, dass API-Änderungen beschädigt werden. Jedenfalls wollte ich nur darauf hinweisen. Danke für die Bearbeitung und das Upvote von mir.
Null 323

25

Es ist einfach RDDeine Kernkomponente, aber DataFrameeine API, die in Spark 1.30 eingeführt wurde.

RDD

Sammlung von Datenpartitionen aufgerufen RDD. Diese RDDmüssen nur wenigen Eigenschaften folgen, wie z.

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

Hier RDDist entweder strukturiert oder unstrukturiert.

DataFrame

DataFrameist 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 DataFramewird eine Sammlung verteilter Daten aufgerufen, die in benannten Spalten organisiert sind DataFrame. Sie können die RDDsin 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. sampleRDDwird (Rohdaten) aufgerufen RDD.


12

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


8

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.


2
RDDs sind übrigens auch faul.
kon psych

6

Einige Einblicke aus Nutzungssicht, RDD vs DataFrame:

  1. RDDs sind unglaublich! da sie uns die Flexibilität geben, mit fast jeder Art von Daten umzugehen; unstrukturierte, halbstrukturierte und strukturierte Daten. Da Daten häufig nicht bereit sind, in einen DataFrame (sogar JSON) eingepasst zu werden, können RDDs verwendet werden, um die Daten vorzuverarbeiten, damit sie in einen Datenrahmen passen. RDDs sind die Kerndatenabstraktion in Spark.
  2. Nicht alle Transformationen, die mit RDD möglich sind, sind mit DataFrames möglich. Beispiel: subtract () gilt für RDD, vs () für DataFrame.
  3. Da DataFrames wie eine relationale Tabelle sind, folgen sie strengen Regeln bei der Verwendung von Set / Relational Theory-Transformationen. Wenn Sie beispielsweise zwei Datenframes zusammenführen möchten, müssen beide dfs dieselbe Anzahl von Spalten und zugehörigen Spaltendatentypen haben. Spaltennamen können unterschiedlich sein. Diese Regeln gelten nicht für RDDs. Hier ist ein gutes Tutorial , das diese Fakten erklärt.
  4. Bei der Verwendung von DataFrames ergeben sich Leistungssteigerungen, wie andere bereits ausführlich erläutert haben.
  5. Mit DataFrames müssen Sie die beliebige Funktion nicht wie beim Programmieren mit RDDs übergeben.
  6. Sie benötigen SQLContext / HiveContext, um Datenrahmen so zu programmieren, wie sie im SparkSQL-Bereich des Spark-Ökosystems liegen. Für RDD benötigen Sie jedoch nur SparkContext / JavaSparkContext, die in Spark Core-Bibliotheken liegen.
  7. Sie können eine df aus einer RDD erstellen, wenn Sie ein Schema dafür definieren können.
  8. Sie können auch ein df in rdd und ein rdd in df konvertieren.

Ich hoffe, es hilft!


5

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)


1

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 - -

Geben Sie hier die Bildbeschreibung ein


0

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


0

Apache Spark - RDD, DataFrame und DataSet

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.


-1

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).


-2

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.