Je me demande simplement quelle est la différence entre un RDD
et DataFrame
(Spark 2.0.0 DataFrame est un simple alias de type pour Dataset[Row]
) dans Apache Spark?
Pouvez-vous convertir l'un à l'autre?
la source
Je me demande simplement quelle est la différence entre un RDD
et DataFrame
(Spark 2.0.0 DataFrame est un simple alias de type pour Dataset[Row]
) dans Apache Spark?
Pouvez-vous convertir l'un à l'autre?
A DataFrame
est bien défini avec une recherche google pour "DataFrame definition":
Une trame de données est une table, ou une structure de type tableau bidimensionnel, dans laquelle chaque colonne contient des mesures sur une variable et chaque ligne contient un cas.
Ainsi, a DataFrame
possède des métadonnées supplémentaires en raison de son format tabulaire, ce qui permet à Spark d'exécuter certaines optimisations sur la requête finalisée.
Un RDD
, d'autre part, est simplement un R esilient D istributed D ataset qui est plus d'une boîte noire des données qui ne peuvent être optimisées que les opérations qui peuvent être effectuées contre, ne sont pas aussi limitées.
Cependant, vous pouvez passer d'un DataFrame à un RDD
via sa rdd
méthode, et vous pouvez passer d'un RDD
à un DataFrame
(si le RDD est dans un format tabulaire) via la toDF
méthode
En général, il est recommandé d'utiliser un DataFrame
dans la mesure du possible en raison de l'optimisation des requêtes intégrée.
Oui .. la conversion entre
Dataframe
etRDD
est absolument possible.Voici quelques exemples d'extraits de code.
df.rdd
estRDD[Row]
Vous trouverez ci-dessous quelques options pour créer un cadre de données.
1) se
yourrddOffrow.toDF
convertit enDataFrame
.2) Utilisation
createDataFrame
du contexte SQLval df = spark.createDataFrame(rddOfRow, schema)
En fait, il existe maintenant 3 API Apache Spark.
RDD
API:Exemple RDD:
Exemple: filtrer par attribut avec RDD
DataFrame
APIExemple de style SQL:
df.filter("age > 21");
Limitations: le code faisant référence aux attributs de données par leur nom, il n'est pas possible pour le compilateur de détecter des erreurs. Si les noms d'attributs sont incorrects, l'erreur n'est détectée qu'au moment de l'exécution, lorsque le plan de requête est créé.
Un autre inconvénient de l'
DataFrame
API est qu'elle est très centrée sur l'échelle et qu'elle prend en charge Java, mais la prise en charge est limitée.Par exemple, lors de la création d'un à
DataFrame
partir d'unRDD
objet Java existant , l'optimiseur Catalyst de Spark ne peut pas déduire le schéma et suppose que tous les objets du DataFrame implémentent l'scala.Product
interface. Scalacase class
travaille sur la boîte car ils implémentent cette interface.Dataset
APIExemple de
Dataset
style SQL API:Les évaluations diff. entre
DataFrame
&DataSet
:Flux de niveau cataliste. . (Démystification de la présentation du DataFrame et du Dataset depuis Spark Summit)
Pour en savoir plus ... article databricks - Une histoire de trois API Apache Spark: RDD vs DataFrames et Datasets
la source
df.filter("age > 21");
cela peut être évalué / analysé uniquement au moment de l'exécution. depuis sa chaîne. Dans le cas des ensembles de données, les ensembles de données sont conformes au bean. donc l'âge est la propriété du haricot. si la propriété age n'est pas présente dans votre bean, alors vous en saurez plus tôt au moment de la compilation (iedataset.filter(_.age < 21);
). L'erreur d'analyse peut être renommée en tant qu'erreur d'évaluation.Apache Spark propose trois types d'API
Voici la comparaison des API entre RDD, Dataframe et Dataset.
RDD
Caractéristiques RDD: -
Collection distribuée:
RDD utilise les opérations MapReduce qui sont largement adoptées pour le traitement et la génération de grands ensembles de données avec un algorithme distribué parallèle sur un cluster. Il permet aux utilisateurs d'écrire des calculs parallèles, en utilisant un ensemble d'opérateurs de haut niveau, sans avoir à se soucier de la répartition du travail et de la tolérance aux pannes.
Immuable: RDD composé d'une collection d'enregistrements qui sont partitionnés. Une partition est une unité de base du parallélisme dans un RDD, et chaque partition est une division logique des données qui est immuable et créée par le biais de certaines transformations sur les partitions existantes. L'immutabilité aide à assurer la cohérence des calculs.
Tolérant aux pannes: dans le cas où nous perdons une partition de RDD, nous pouvons rejouer la transformation sur cette partition dans la lignée pour obtenir le même calcul, plutôt que de faire une réplication de données sur plusieurs nœuds. Cette caractéristique est le plus grand avantage du RDD car il enregistre beaucoup d'efforts dans la gestion et la réplication des données et permet ainsi des calculs plus rapides.
Évaluations paresseuses: toutes les transformations dans Spark sont paresseuses, en ce sens qu'elles ne calculent pas immédiatement leurs résultats. Au lieu de cela, ils se souviennent simplement des transformations appliquées à un ensemble de données de base. Les transformations ne sont calculées que lorsqu'une action nécessite qu'un résultat soit renvoyé au programme pilote.
Transformations fonctionnelles: les RDD prennent en charge deux types d'opérations: les transformations, qui créent un nouvel ensemble de données à partir d'un ensemble existant, et les actions, qui renvoient une valeur au programme du pilote après avoir exécuté un calcul sur l'ensemble de données.
Formats de traitement des données:
il peut traiter facilement et efficacement des données structurées et non structurées.
Langages de programmation pris en charge: l'
API RDD est disponible en Java, Scala, Python et R.
Limitations RDD: -
Aucun moteur d'optimisation intégré: lorsqu'ils travaillent avec des données structurées, les RDD ne peuvent pas tirer parti des optimiseurs avancés de Spark, y compris l'optimiseur de catalyseur et le moteur d'exécution Tungsten. Les développeurs doivent optimiser chaque RDD en fonction de ses attributs.
Gestion des données structurées: contrairement au Dataframe et aux ensembles de données, les RDD n'infèrent pas le schéma des données ingérées et nécessitent que l'utilisateur le spécifie.
Cadres de données
Spark a introduit les Dataframes dans la version Spark 1.3. La trame de données surmonte les principaux défis rencontrés par les RDD.
Caractéristiques de la trame de données: -
Collection distribuée d'objets de ligne: un DataFrame est une collection distribuée de données organisée en colonnes nommées. Il est conceptuellement équivalent à une table dans une base de données relationnelle, mais avec des optimisations plus riches sous le capot.
Traitement des données: traitement des formats de données structurés et non structurés (Avro, CSV, recherche élastique et Cassandra) et des systèmes de stockage (HDFS, tables HIVE, MySQL, etc.). Il peut lire et écrire à partir de toutes ces différentes sources de données.
Optimisation à l'aide de l'optimiseur de catalyseur: il alimente à la fois les requêtes SQL et l'API DataFrame. La trame de données utilise un cadre de transformation d'arbre de catalyseur en quatre phases,
Compatibilité Hive: à l' aide de Spark SQL, vous pouvez exécuter des requêtes Hive non modifiées sur vos entrepôts Hive existants. Il réutilise le frontend Hive et MetaStore et vous offre une compatibilité totale avec les données, requêtes et UDF Hive existants.
Tungsten: Tungsten fournit un backend d'exécution physique qui gère explicitement la mémoire et génère dynamiquement des bytecodes pour l'évaluation des expressions.
Langages de programmation pris en charge: l'
API Dataframe est disponible en Java, Scala, Python et R.
Limitations de la trame de données: -
Exemple:
Cela est particulièrement difficile lorsque vous travaillez avec plusieurs étapes de transformation et d'agrégation.
Exemple:
API de jeux de données
Caractéristiques de l'ensemble de données: -
Fournit le meilleur du RDD et du Dataframe: RDD (programmation fonctionnelle, type sécurisé), DataFrame (modèle relationnel, optimisation de requête, exécution de tungstène, tri et mélange)
Encodeurs: avec l'utilisation des encodeurs, il est facile de convertir n'importe quel objet JVM en un ensemble de données, permettant aux utilisateurs de travailler avec des données structurées et non structurées contrairement à Dataframe.
Langages de programmation pris en charge: l' API Datasets n'est actuellement disponible qu'en Scala et Java. Python et R ne sont actuellement pas pris en charge dans la version 1.6. La prise en charge de Python est prévue pour la version 2.0.
Sécurité de type: l' API Datasets offre une sécurité de compilation qui n'était pas disponible dans Dataframes. Dans l'exemple ci-dessous, nous pouvons voir comment l'ensemble de données peut fonctionner sur des objets de domaine avec des fonctions de compilation lambda.
Exemple:
Limitation de l'API de jeux de données: -
Exemple:
Pas de prise en charge de Python et R: depuis la version 1.6, les jeux de données ne prennent en charge que Scala et Java. La prise en charge de Python sera introduite dans Spark 2.0.
L'API Datasets apporte plusieurs avantages par rapport à l'API RDD et Dataframe existante avec une meilleure sécurité de type et une programmation fonctionnelle.Avec le défi des exigences de transtypage de type dans l'API, vous ne seriez toujours pas la sécurité de type requise et rendrait votre code fragile.
la source
Dataset
n'est pas LINQ et l'expression lambda ne peut pas être interprétée comme des arbres d'expression. Par conséquent, il existe des boîtes noires et vous perdez à peu près tous (sinon tous) les avantages de l'optimiseur. Juste un petit sous-ensemble des inconvénients possibles: Spark 2.0 Dataset vs DataFrame . Aussi, juste pour répéter quelque chose que j'ai déclaré plusieurs fois - en général, la vérification de type de bout en bout n'est pas possible avec l'Dataset
API. Les jointures sont juste l'exemple le plus important.Tous (RDD, DataFrame et DataSet) en une seule image.
crédits d'image
RDD
DataFrame
Dataset
Nice comparison of all of them with a code snippet.
la source
Oui, les deux sont possibles
1.
RDD
àDataFrame
avec.toDF()
plusieurs façons: convertir un objet RDD en Dataframe dans Spark
2.
DataFrame
/DataSet
àRDD
avec.rdd()
méthodela source
Parce qu'il
DataFrame
est faiblement typé et que les développeurs ne bénéficient pas des avantages du système de saisie. Par exemple, disons que vous voulez lire quelque chose à partir de SQL et exécuter une agrégation dessus:Lorsque vous dites
people("deptId")
que vous ne récupérez pas unInt
ou unLong
, vous récupérez unColumn
objet sur lequel vous devez opérer. Dans les langues avec des systèmes de type riches tels que Scala, vous finissez par perdre toute la sécurité de type qui augmente le nombre d'erreurs d'exécution pour les choses qui pourraient être découvertes au moment de la compilation.Au contraire,
DataSet[T]
est tapé. quand tu fais:En fait, vous récupérez un
People
objet, où sedeptId
trouve un type intégral réel et non un type de colonne, tirant ainsi parti du système de type.À partir de Spark 2.0, les API DataFrame et DataSet seront unifiées, où
DataFrame
sera un alias de type pourDataSet[Row]
.la source
Dataframe
n'est qu'un alias pourDataset[Row]
DataFrame
était d'éviter de casser les changements d'API. Quoi qu'il en soit, je voulais juste le signaler. Merci pour la modification et le vote positif de ma part.Il
RDD
s'agit simplement du composant principal, mais ilDataFrame
s'agit d'une API introduite dans l'étincelle 1.30.RDD
Collection de partitions de données appelée
RDD
. Ceux-ciRDD
doivent suivre quelques propriétés telles que:Ici,
RDD
c'est structuré ou non structuré.Trame de données
DataFrame
est une API disponible en Scala, Java, Python et R. Elle permet de traiter tout type de données Structurées et semi structurées. Pour définirDataFrame
, une collection de données distribuées organisées en colonnes nommées appeléesDataFrame
. Vous pouvez facilement optimiser leRDDs
dans leDataFrame
. Vous pouvez traiter les données JSON, les données parquet, les données HiveQL à la fois à l'aide deDataFrame
.Ici Sample_DF considère comme
DataFrame
.sampleRDD
est (données brutes) appeléRDD
.la source
La plupart des réponses sont correctes, je veux seulement ajouter un point ici
Dans Spark 2.0, les deux API (DataFrame + DataSet) seront unifiées ensemble en une seule API.
"Unification de DataFrame et Dataset: Dans Scala et Java, DataFrame et Dataset ont été unifiés, c'est-à-dire que DataFrame n'est qu'un alias de type pour Dataset of Row. En Python et R, étant donné le manque de sécurité de type, DataFrame est la principale interface de programmation."
Les jeux de données sont similaires aux RDD, cependant, au lieu d'utiliser la sérialisation Java ou Kryo, ils utilisent un encodeur spécialisé pour sérialiser les objets pour le traitement ou la transmission sur le réseau.
Spark SQL prend en charge deux méthodes différentes pour convertir des RDD existants en ensembles de données. La première méthode utilise la réflexion pour déduire le schéma d'un RDD qui contient des types spécifiques d'objets. Cette approche basée sur la réflexion conduit à un code plus concis et fonctionne bien lorsque vous connaissez déjà le schéma lors de l'écriture de votre application Spark.
La deuxième méthode de création de jeux de données consiste à utiliser une interface de programmation qui vous permet de construire un schéma, puis de l'appliquer à un RDD existant. Bien que cette méthode soit plus détaillée, elle vous permet de construire des ensembles de données lorsque les colonnes et leurs types ne sont pas connus avant l'exécution.
Ici vous pouvez trouver RDD tof réponse de conversation de trame de données
Comment convertir un objet RDD en un cadre de données dans Spark
la source
Un DataFrame est équivalent à une table dans un SGBDR et peut également être manipulé de manière similaire aux collections distribuées "natives" dans des RDD. Contrairement aux RDD, les Dataframes assurent le suivi du schéma et prennent en charge diverses opérations relationnelles qui conduisent à une exécution plus optimisée. Chaque objet DataFrame représente un plan logique mais en raison de leur nature "paresseuse" aucune exécution ne se produit jusqu'à ce que l'utilisateur appelle une "opération de sortie" spécifique.
la source
Quelques informations du point de vue de l'utilisation, RDD vs DataFrame:
J'espère que ça aide!
la source
Un Dataframe est un RDD d'objets Row, chacun représentant un enregistrement. Un Dataframe connaît également le schéma (c'est-à-dire les champs de données) de ses lignes. Alors que les cadres de données ressemblent à des RDD normaux, en interne, ils stockent les données de manière plus efficace, en tirant parti de leur schéma. En outre, ils fournissent de nouvelles opérations non disponibles sur les RDD, telles que la possibilité d'exécuter des requêtes SQL. Les cadres de données peuvent être créés à partir de sources de données externes, à partir des résultats de requêtes ou à partir de RDD standard.
Référence: Zaharia M., et al. Learning Spark (O'Reilly, 2015)
la source
Spark RDD (resilient distributed dataset)
:RDD est l'API d'abstraction des données de base et est disponible depuis la toute première version de Spark (Spark 1.0). Il s'agit d'une API de niveau inférieur pour manipuler la collecte distribuée de données. Les API RDD présentent certaines méthodes extrêmement utiles qui peuvent être utilisées pour obtenir un contrôle très strict sur la structure de données physiques sous-jacente. Il s'agit d'une collection immuable (en lecture seule) de données partitionnées réparties sur différentes machines. RDD permet le calcul en mémoire sur de grands clusters pour accélérer le traitement des mégadonnées d'une manière tolérante aux pannes. Pour activer la tolérance aux pannes, RDD utilise DAG (Directed Acyclic Graph) qui consiste en un ensemble de sommets et d'arêtes. Les sommets et les arêtes dans DAG représentent respectivement le RDD et l'opération à appliquer sur ce RDD. Les transformations définies sur RDD sont paresseuses et ne s'exécutent que lorsqu'une action est appelée
Spark DataFrame
:Spark 1.3 a introduit deux nouvelles API d'abstraction de données - DataFrame et DataSet. Les API DataFrame organisent les données dans des colonnes nommées comme une table dans la base de données relationnelle. Il permet aux programmeurs de définir un schéma sur une collection distribuée de données. Chaque ligne d'un DataFrame est de type objet. Comme une table SQL, chaque colonne doit avoir le même nombre de lignes dans un DataFrame. En bref, DataFrame est un plan évalué paresseusement qui spécifie les opérations à effectuer sur la collecte distribuée des données. DataFrame est également une collection immuable.
Spark DataSet
:En tant qu'extension des API DataFrame, Spark 1.3 a également introduit des API DataSet qui fournissent une interface de programmation strictement typée et orientée objet dans Spark. Il s'agit d'une collection immuable et sécurisée de données distribuées. Comme DataFrame, les API DataSet utilisent également le moteur Catalyst pour permettre l'optimisation de l'exécution. DataSet est une extension des API DataFrame.
Other Differences
-la source
Un DataFrame est un RDD qui a un schéma. Vous pouvez la considérer comme une table de base de données relationnelle, dans la mesure où chaque colonne a un nom et un type connu. La puissance des DataFrames vient du fait que, lorsque vous créez un DataFrame à partir d'un ensemble de données structuré (Json, Parquet ..), Spark est capable d'inférer un schéma en effectuant une passe sur l'ensemble (Json, Parquet ..) ensemble de données qui est en cours de chargement. Ensuite, lors du calcul du plan d'exécution, Spark peut utiliser le schéma et effectuer des optimisations de calcul nettement meilleures. Notez que DataFrame était appelé SchemaRDD avant Spark v1.3.0
la source
Apache Spark - RDD, DataFrame et DataSet
Spark RDD -
Spark Dataframe -
Ensemble de données Spark -
la source
Vous pouvez utiliser des RDD avec des structures et des structures non structurées alors que le Dataframe / Dataset ne peut traiter que les données structurées et semi-structurées (il a un schéma approprié)
la source
Toutes les bonnes réponses et l'utilisation de chaque API ont un compromis. L'ensemble de données est conçu pour être une super API pour résoudre beaucoup de problèmes, mais souvent, RDD fonctionne toujours mieux si vous comprenez vos données et si l'algorithme de traitement est optimisé pour faire beaucoup de choses en un seul passage vers de grandes données, alors RDD semble la meilleure option.
L'agrégation utilisant l'API d'ensemble de données consomme toujours de la mémoire et s'améliorera avec le temps.
la source