PySparkにはdrop
というメソッドがありますが、一度に1列しかドロップできないようです。複数の列を同時にドロップする方法についてのアイデアはありますか?
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
単に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のdetialsのドロップメソッドを実装します。PySpark 2.1.0のメソッドdrop
複数の列をサポート :
PySpark2.0.2:
DataFrame.drop(col)
PySpark2.1.0:
DataFrame.drop(*cols)
例:
df.drop('col1', 'col2')