web-dev-qa-db-fra.com

Comment exclure plusieurs colonnes dans Spark dataframe dans Python

J'ai trouvé que PySpark a une méthode appelée drop mais il semble qu'il ne peut supprimer qu'une colonne à la fois. Des idées sur la façon de supprimer plusieurs colonnes en même temps?

df.drop(['col1','col2'])
TypeError                                 Traceback (most recent call last)
<ipython-input-96-653b0465e457> in <module>()
----> 1 selectedMachineView = machineView.drop([['GpuName','GPU1_TwoPartHwID']])

/usr/hdp/current/spark-client/python/pyspark/sql/dataframe.pyc in drop(self, col)
   1257             jdf = self._jdf.drop(col._jc)
   1258         else:
-> 1259             raise TypeError("col should be a string or a Column")
   1260         return DataFrame(jdf, self.sql_ctx)
   1261 

TypeError: col should be a string or a Column
24
MYjx

Simplement avec select:

df.select([c for c in df.columns if c not in {'GpuName','GPU1_TwoPartHwID'}])

ou si vous voulez vraiment utiliser drop alors reduce devrait faire l'affaire:

from functools import reduce
from pyspark.sql import DataFrame

reduce(DataFrame.drop, ['GpuName','GPU1_TwoPartHwID'], df)

Remarque :

( différence de temps d'exécution):

Il ne devrait pas y avoir de différence en ce qui concerne le temps de traitement des données. Bien que ces méthodes génèrent différents plans logiques, les plans physiques sont exactement les mêmes.

Il y a cependant une différence lorsque nous analysons le code côté conducteur:

  • la première méthode ne fait qu'un seul appel JVM tandis que la seconde doit appeler JVM pour chaque colonne à exclure
  • la première méthode génère un plan logique équivalent au plan physique. Dans le second cas, il est réécrit.
  • enfin les compréhensions sont beaucoup plus rapides en Python que les méthodes comme map ou reduce
  • Spark 2.x + prend en charge plusieurs colonnes dans drop. Voir SPARK-11884 ( Supprimer plusieurs colonnes dans l'API DataFrame) et SPARK-12204 ( Implémenter la méthode de suppression pour DataFrame dans SparkR) pour les detials.
43
zero323

Dans la méthode PySpark 2.1.0 dropprend en charge plusieurs colonnes :

PySpark 2.0.2 :

DataFrame.drop(col)

PySpark 2.1.0 :

DataFrame.drop(*cols)

Exemple:

df.drop('col1', 'col2')
31
Patrick Z