Qu'est-ce que l'Étincelle DataFrame la méthode `toPandas` en train de faire?
Je suis un débutant de la Spark-DataFrame de l'API.
J'utilise ce code pour charger csv séparé par des tabulations 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éer DataFrame avec Étincelle de nouveaux fichiers, et de les convertir pandas à l'aide intégrée dans la méthode toPandas(),
- T-il stocker les Pandas objet de la mémoire locale?
- Ne Pandas faible niveau de calcul est occupé de tous par Étincelle?
- T-il exposé tous les pandas dataframe de la fonctionnalité?(Je suppose que oui)
- Puis-je convertir toPandas et de le faire juste avec elle, sans pour autant toucher DataFrame de l'API?
Vous devez vous connecter pour publier un commentaire.
À l'aide de l'étincelle à lire dans un fichier CSV pour
pandas
est tout à fait un rond-point de la méthode pour atteindre l'objectif de la fin de la lecture d'un fichier CSV dans la mémoire.Il semble que vous pourriez être la mauvaise compréhension du cas d'utilisation des technologies en jeu ici.
Étincelle pour le calcul distribué (bien qu'il peut être utilisé localement). Il est généralement beaucoup trop lourd pour être utilisé simplement pour la lecture dans un fichier CSV.
Dans votre exemple, le
sc.textFile
méthode tout simplement vous donner une étincelle CA c'est effectivement une liste de lignes de texte. Ce n'est probablement pas ce que vous voulez. Aucune inférence de type sera effectué, donc si vous souhaitez calculer la somme d'une colonne de nombres dans un fichier CSV, vous ne pourrez pas parce qu'ils sont toujours des chaînes d'aussi loin que l'Étincelle est concerné.Suffit d'utiliser
pandas.read_csv
et de lire l'ensemble du CSV en mémoire. Les Pandas seront automatiquement déduire le type de chaque colonne. La Spark n'a pas le faire.Maintenant pour répondre à vos questions:
T-il stocker les Pandas objet de la mémoire locale:
Oui.
toPandas()
va convertir l'Étincelle DataFrame dans une Pandas DataFrame, qui est bien sûr en mémoire.Ne Pandas faible niveau de calcul est occupé de tous par Spark
Pas. Les Pandas s'exécute ses propres calculs, il n'y a aucune interaction entre l'étincelle et les pandas, il n'y a certains compatibilité de l'API.
T-il exposé tous les pandas dataframe de la fonctionnalité?
Pas. Par exemple,
Series
objets ont uneinterpolate
méthode qui n'est pas disponible dans PySparkColumn
objets. Il ya beaucoup de méthodes et fonctions qui sont dans les pandas de l'API qui ne sont pas dans le PySpark API.Puis-je convertir toPandas et de le faire juste avec elle, sans pour autant toucher DataFrame API?
Absolument. En fait, vous ne devriez probablement pas le même usage Étincelle à tous dans ce cas.
pandas.read_csv
sera probablement gérer votre cas d'utilisation, sauf si vous travaillez avec un énorme quantité de données.Essayer de résoudre votre problème avec des simple, de faible technologie, facile-à-comprendre les bibliothèques, et seulement aller à quelque chose de plus compliqué que vous en avez besoin. Plusieurs fois, vous n'aurez pas besoin d'une technologie plus complexe.
HiveContext.createDataFrame
.À l'aide d'une étincelle contexte ou la ruche contexte de la méthode (
sc.textFile()
,hc.sql()
) pour lire les données dans la mémoire' retourne une CA, mais CA reste dans la répartition de la mémoire (mémoire sur les nœuds de travail), pas de mémoire sur le nœud maître. Tous les RDD méthodes (rdd.map()
,rdd.reduceByKey()
, etc) sont conçus pour fonctionner en parallèle sur les nœuds de travail, à quelques exceptions près. Par exemple, si vous exécutez unrdd.collect()
méthode, en fin de compte vous copie le contenu de la rdd à partir de tous les nœuds de travail pour le nœud maître de mémoire. Ainsi, vous perdez votre distribués de calcul des prestations (mais on peut toujours exécuter le rdd méthodes).De la même façon avec les pandas, lorsque vous exécutez
toPandas()
, vous copier le bloc de données à partir distribués (travailleur) de mémoire pour le local (maître) de la mémoire et de perdre la plupart de vos capacités de calcul distribué. Ainsi, un flux de production possible (que j'utilise souvent) peut être pré-munge vos données dans une taille raisonnable distribué à l'aide de méthodes de calcul et ensuite de les convertir à une Pandas bloc de données pour l'ensemble de fonctionnalités riches. Espérons que cela aide.