Comment exclure plusieurs colonnes dans Spark dataframe en Python

J'ai trouvé que PySpark a une méthode appelée drop mais il semble qu'il ne peut déposer une colonne à la fois. Toutes les idées sur la façon de déposer 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
17
demandé sur Community 2016-02-27 22:35:44

2 réponses

Simplement select:

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

ou si vous voulez vraiment utiliser dropreduce 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. Alors que ces méthodes génèrent des plans logiques différents, les plans physiques sont exactement les mêmes.

il y a une différence cependant quand nous analysons code côté conducteur:

  • la première méthode ne fait qu'un seul appel JVM alors que la seconde doit appeler JVM pour chaque colonne qui doit être exclue
  • la première méthode génère un plan logique qui est équivalent au plan physique. Dans le second cas, il est réécrit.
  • enfin les compréhensions sont significativement plus rapides en Python que les méthodes comme map ou reduce
  • étincelle 2.x+ supporte plusieurs colonnes dans drop. Voir SPARK-11884 (Chute de plusieurs colonnes dans le DataFrame API et SPARK-12204 (implémenter la méthode drop pour DataFrame dans SparkR) pour plus d'informations.
36
répondu zero323 2017-02-24 15:11:56

Dans PySpark 2.1.0 méthode drop supporte plusieurs colonnes:

PySpark 2.0.2:

DataFrame.drop(col)

PySpark 2.1.0:

DataFrame.drop(*cols)

Exemple:

df.drop('col1', 'col2')
18
répondu Patrick Z 2017-02-04 18:02:43