Pyspark: удаление столбцов без различных значений только с помощью преобразований

У меня огромный фрейм данных с 1340 столбцами. Перед тем, как погрузиться в моделирование, я должен избавиться от столбцов без отдельных значений. Несколько способов, которые я нашел для этого, требуют действий в фрейме данных, т.е. это занимает много времени (около 75 часов). Как решить эту проблему только с помощью Преобразований, чтобы сэкономить много времени?

Я использую Azure Databricks, на которой работают Apache Spark 2.4.0 и Python 3.5.
Технические характеристики кластера:
- Рабочий: 56 ГБ памяти, 16 ядер
- Драйвер: 56 ГБ памяти, 16 ядер
2-8 узлов (автозапуск)

from pyspark.sql.functions import *
# This shouldn't be run

cols_to_drop = []

for c in df.columns:
  # Extracting the value computed by countDistinct()
  # Here collect() is time-consuming because it's an action
  if df.agg(countDistinct(c)).collect()[0][0] < 2:
    print("{} has no distinct values.".format(c))
    cols_to_drop.append(c)

print(len(cols_to_drop))
df = df.drop(*cols_to_drop)

Также я попытался использовать about_count_distinct, который должен быть быстрее с ошибкой оценки> 0,01. Но это не сильно менялось и часто длилось дольше.

Я бы хотел что-то, что выполняет ту же работу - отбрасывает столбцы без отдельных значений - без функции, которая подразумевает действие, такое как collect ().

Изменить:
Это не рекомендуется для больших наборов данных, но я все равно сделал это. Преобразование моего фрейма данных в фреймворк pandas с помощью toPandas (). Прошло 10 минут, что довольно прилично. Тогда это поможет:

cols_to_drop = [c for c in f.columns if len(df[c].unique()) < 2]

person LePuppy    schedule 11.04.2019    source источник
comment
1) Вы вызываете collect в цикле для каждого столбца - конечно, это будет медленным. 2) Если вы можете конвертировать в панды, вам, вероятно, следует просто использовать панды. Мое практическое правило - используйте искру только тогда, когда вы не можете сделать это в памяти или слишком медленно.   -  person pault    schedule 11.04.2019
comment
pault 1) У вас есть другое решение? В чем суть моего вопроса 2) Я в основном использую искру, и пока все идет отлично. Вызовы Pandas будут обрабатываться только драйвером, и это будет намного дольше. К счастью, в большинстве случаев у вас есть эффективные функции pyspark.   -  person LePuppy    schedule 12.04.2019
comment
Тема, которую вы опубликовали, действительно очень близка к моему вопросу, и кто-то опубликовал решение, которое действительно может сработать (pyspark + pandas).   -  person LePuppy    schedule 12.04.2019
comment
Любое решение по ускорению вышеуказанного процесса на более крупном наборе данных с использованием pyspark? Когда я использую pyspark, на то, чтобы бросить кломаны, уходит слишком много времени.   -  person Raj    schedule 26.08.2020