2016-02-27 20 views
13

Ho trovato che pyspark ha un metodo chiamato drop ma sembra che possa rilasciare solo una colonna alla volta. Qualche idea su come rilasciare più colonne allo stesso tempo?Come escludere più colonne in Spark dataframe in Python

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 

risposta

31

Semplicemente con select:

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

o se si vuole veramente utilizzare drop poi reduce dovrebbe fare il trucco:

from functools import reduce 
from pyspark.sql import DataFrame 

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

Nota:

(differenza nel tempo di esecuzione):

Non ci dovrebbero essere differenze quando si tratta del tempo di elaborazione dei dati. Mentre questi metodi generano piani logici diversi, i piani fisici sono esattamente gli stessi.

C'è una differenza però quando analizziamo codice lato guida:

  • il primo metodo fa solo una singola chiamata JVM mentre la seconda deve chiamare JVM per ogni colonna che deve essere escluso
  • il primo metodo genera un piano logico che è equivalente al piano fisico. Nel secondo caso viene riscritto.
  • finalmente comprensioni sono significativamente più veloce in Python di metodi come map o reduce
  • Spark 2.x + supporta più colonne in drop. Vedere SPARK-11884 (Rilasciare più colonne nell'API DataFrame) e SPARK-12204 (Implementare il metodo di rilascio per DataFrame in SparkR) per detials.
13

In PySpark 2.1.0 metodo dropsupports multiple columns:

PySpark 2.0.2:

DataFrame.drop(col) 

PySpark 2.1.0:

DataFrame.drop(*cols) 

Esempio:

df.drop('col1', 'col2') 
Problemi correlati