web-dev-qa-db-fra.com

Que fait réellement la méthode Spark DataFrame `toPandas`?

Je suis un débutant de l'API Spark-DataFrame. 

J'utilise ce code pour charger des fichiers csv séparés dans Spark Dataframe

lines = sc.textFile('tail5.csv')
parts = lines.map(lambda l : l.strip().split('\t'))
fnames = *some name list*
schemaData = StructType([StructField(fname, StringType(), True) for fname in fnames])
ddf = sqlContext.createDataFrame(parts,schemaData)

Supposons que je crée DataFrame avec Spark à partir de nouveaux fichiers et que je le convertisse en pandas à l'aide de la méthode intégrée toPandas (),

  • Stocke-t-il l'objet Pandas dans la mémoire locale?
  • Est-ce que le calcul de bas niveau des Pandas est géré par Spark?
  • At-il exposé toutes les fonctionnalités du cadre de données des pandas? (Je suppose que oui)
  • Puis-je le convertir en pandas et le faire simplement sans toucher autant à l'API DataFrame? 
37
Napitupulu Jon

Utiliser spark pour lire un fichier CSV dans pandas est une méthode plutôt détournée pour atteindre l'objectif final de la lecture d'un fichier CSV en mémoire.

Vous avez peut-être mal compris les cas d'utilisation des technologies en jeu ici.

Spark est destiné à l'informatique distribuée (bien qu'il puisse être utilisé localement). Il est généralement beaucoup trop lourd pour être utilisé simplement pour lire dans un fichier CSV.

Dans votre exemple, la méthode sc.textFile vous donnera simplement un RDD spark qui est en réalité une liste de lignes de texte. Ce n'est probablement pas ce que vous voulez. Aucune inférence de type ne sera effectuée. Par conséquent, si vous souhaitez additionner une colonne de nombres dans votre fichier CSV, vous ne pourrez pas le faire, car ils sont toujours des chaînes pour Spark.

Utilisez simplement pandas.read_csv et lisez l'intégralité du CSV en mémoire. Les pandas déduiront automatiquement le type de chaque colonne. Spark ne fait pas ça.

Maintenant, pour répondre à vos questions:

Stocke-t-il l'objet Pandas dans la mémoire locale :

Oui. toPandas() convertira le Spark DataFrame en un Pandas DataFrame, qui est bien sûr en mémoire.

Est-ce que le calcul de bas niveau des Pandas est géré par Spark

Non. Pandas exécute ses propres calculs. Il n’ya pas d’interaction entre spark et pandas. Il ya simplement la compatibilité avec les certaines API.

At-il exposé toutes les fonctionnalités du cadre de données pandas?

Par exemple, les objets Series ont une méthode interpolate qui n'est pas disponible dans les objets PySpark Column. L'API pandas contient de nombreuses méthodes et fonctions qui ne figurent pas dans l'API PySpark.

Puis-je convertir toPandas et juste faire avec, sans trop toucher à l'API DataFrame?

Absolument. En fait, vous ne devriez probablement même pas utiliser Spark du tout dans ce cas. pandas.read_csv gérera probablement votre cas d'utilisation, sauf si vous travaillez avec une quantité de données énorme.

Essayez de résoudre votre problème avec des bibliothèques simples, peu sophistiquées, faciles à comprendre et seulement passez à quelque chose de plus compliqué si vous en avez besoin. Souvent, vous n’avez pas besoin d’une technologie plus complexe.

48
Phillip Cloud

L'utilisation d'un contexte d'étincelle ou d'une méthode de contexte Hive (sc.textFile(), hc.sql()) pour lire des données 'en mémoire' renvoie un RDD, mais le RDD reste dans la mémoire distribuée (mémoire sur les nœuds de travail), et non sur le nœud maître. Toutes les méthodes RDD (rdd.map(), rdd.reduceByKey(), etc.) sont conçues pour s'exécuter en parallèle sur les nœuds de travail, à quelques exceptions près. Par exemple, si vous exécutez une méthode rdd.collect(), vous finissez par copier le contenu du rdd de tous les nœuds de travail dans la mémoire du nœud maître. Ainsi, vous perdez vos avantages de calcul distribué (mais vous pouvez toujours exécuter les méthodes rdd).

De même avec les pandas, lorsque vous exécutez toPandas(), vous copiez le cadre de données de la mémoire distribuée (travailleur) vers la mémoire locale (maître) et vous perdez la plupart de vos capacités de calcul distribuées. Ainsi, un flux de travail possible (que j'utilise souvent) pourrait consister à pré-assembler vos données à une taille raisonnable à l'aide de méthodes de calcul distribuées, puis à les convertir en un cadre de données Pandas pour l'ensemble de fonctionnalités enrichi. J'espère que cela pourra aider.

1
TheProletariat