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

时间:2016-02-27 19:35:44

标签: apache-spark dataframe pyspark apache-spark-sql

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

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

3 个答案:

答案 0 :(得分:42)

只需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
  • 等方法
  • Spark 2.x + 支持drop中的多个列。有关详细信息,请参阅SPARK-11884在DataFrame API中删除多个列)和SPARK-12204在SparkR中为DataFrame实现drop方法)。

答案 1 :(得分:26)

在PySpark 2.1.0方法中drop supports multiple columns

PySpark 2.0.2

DataFrame.drop(col)

PySpark 2.1.0

DataFrame.drop(*cols)

示例:

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

答案 2 :(得分:-1)

正确的方法是:

df.drop(* ['col1','col2','col3'])

如果要删除多列,则*必须在方括号之外。