Подтвердить что ты не робот

Как исключить несколько столбцов в Spark dataframe в Python

Я обнаружил, что в 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
4b9b3361

Ответ 1

Просто с 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 понимание значительно быстрее, чем методы типа map или reduce
  • Spark 2.x + поддерживает несколько столбцов в drop. См. SPARK-11884 (удалите несколько столбцов в API DataFrame) и SPARK-12204 (примените метод drop для DataFrame в SparkR) для detials.

Ответ 3

Правильный способ сделать это:

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

Символ * должен выходить за скобки, если нужно удалить несколько столбцов.