如何在Python中排除Spark数据帧中的多个列

MYj*_*Yjx 25 dataframe apache-spark apache-spark-sql pyspark

我发现PySpark有一个调用的方法,drop但它似乎一次只能删除一列.有关如何同时删除多个列的任何想法?

df.drop(['col1','col2'])
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

zer*_*323 43

只需select:

df.select([c for c in df.columns if c not in {'GpuName','GPU1_TwoPartHwID'}])
Run Code Online (Sandbox Code Playgroud)

或者如果你真的想使用drop那么reduce应该做的诀窍:

from functools import reduce
from pyspark.sql import DataFrame

reduce(DataFrame.drop, ['GpuName','GPU1_TwoPartHwID'], df)
Run Code Online (Sandbox Code Playgroud)

注意:

(执行时间的差异):

在数据处理时间方面应该没有区别.虽然这些方法生成不同的逻辑计划,但物理计划完全相同.

但是,当我们分析驱动程序端代码时,存在差异:

  • 第一种方法只进行一次JVM调用,而第二种方法必须为每个必须被排除的列调用JVM
  • 第一种方法生成逻辑计划,相当于物理计划.在第二种情况下,它被重写.
  • 最后,理解在Python中比在map或等方法上快得多reduce
  • Spark 2.x +支持多列drop.有关详细信息,请参阅SPARK-11884(在DataFrame API中删除多个列)和SPARK-12204(在SparkR中实现DataFrame的drop drop方法).


小智 34

在PySpark中,2.1.0方法drop 支持多列:

PySpark 2.0.2:

DataFrame.drop(col)
Run Code Online (Sandbox Code Playgroud)

PySpark 2.1.0:

DataFrame.drop(*cols)
Run Code Online (Sandbox Code Playgroud)

例:

df.drop('col1', 'col2')
Run Code Online (Sandbox Code Playgroud)

  • 只是要清楚一点,以防万一,对于某些登陆这里的人来说,当@Patrick在上面写`DataFrame.drop(* cols)`时,`cols **是Python列表**,然后[将星号在将其转换为位置参数之前](/sf/ask/204529321/)。 (4认同)

Cer*_*ren 8

正确的做法是:

df.drop(*['col1', 'col2', 'col3'])
Run Code Online (Sandbox Code Playgroud)

*需求来括号外面如果有多个列的下降。