2016-02-27 74 views
13

我發現pyspark有一個名爲drop的方法,但它似乎一次只能刪除一列。關於如何同時放置多個列的任何想法?如何在Python中排除Spark數據框中的多列

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 

回答

31

只需使用select

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

,或者如果你真的想用drop然後reduce應該做的伎倆:

from functools import reduce 
from pyspark.sql import DataFrame 

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

注意

執行時間差異):

數據處理時間應該沒有差異。雖然這些方法產生不同的邏輯計劃,但物理計劃完全相同。

是有區別的但是當我們分析駕駛員側代碼:

  • 第一方法使得僅單個JVM呼叫而第二個必須調用JVM用於具有要被排除
  • 每一列
  • 第一種方法生成相當於物理計劃的邏輯計劃。在第二種情況下,它被重寫。
  • 終於內涵是顯著更快在Python不是像mapreduce
  • 火花2.x的+支持drop多列的方法。請參閱SPARK-11884刪除DataFrame API中的多個列)和SPARK-12204爲SparkR中的DataFrame實施刪除方法)以進行detials。
13

在PySpark 2.1.0方法dropsupports multiple columns

PySpark 2.0.2

DataFrame.drop(col) 

PySpark 2.1.0

DataFrame.drop(*cols) 

示例:

df.drop('col1', 'col2') 
相關問題