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 drop
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. 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
oureduce
- é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