我发现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
答案 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)
注意强>:
(执行时间的差异):
在数据处理时间方面应该没有区别。虽然这些方法生成不同的逻辑计划,但物理计划完全相同。
然而,当我们分析驱动程序端代码时存在差异:
map
或reduce
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'])
如果要删除多列,则*必须在方括号之外。