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
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:
map
ou reduce
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.Dans la méthode PySpark 2.1.0 drop
prend en charge plusieurs colonnes :
PySpark 2.0.2 :
DataFrame.drop(col)
PySpark 2.1.0 :
DataFrame.drop(*cols)
Exemple:
df.drop('col1', 'col2')