web-dev-qa-db-ja.com

Spark dataframe in Pythonの複数の列を除外する方法

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
24
MYjx

単に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呼び出しのみを行いますが、2番目のメソッドは除外する必要がある各列に対してJVMを呼び出す必要があります
  • 最初の方法は、物理計画と同等の論理計画を生成します。 2番目のケースでは書き換えられます。
  • 最後に、Pythonではmapreduceなどのメソッドよりも理解が大幅に速くなります。
  • Spark 2.x +は、dropの複数の列をサポートします。 SPARK-11884DataFrame API)で複数の列をドロップするおよび SPARK-12204SparkR)のDataFrameのdetialsのドロップメソッドを実装します。
43
zero323

PySpark 2.1.0のメソッドdrop複数の列をサポート

PySpark2.0.2

DataFrame.drop(col)

PySpark2.1.0

DataFrame.drop(*cols)

例:

df.drop('col1', 'col2')
31
Patrick Z