У меня огромный фрейм данных с 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]
collect
в цикле для каждого столбца - конечно, это будет медленным. 2) Если вы можете конвертировать в панды, вам, вероятно, следует просто использовать панды. Мое практическое правило - используйте искру только тогда, когда вы не можете сделать это в памяти или слишком медленно. - person pault   schedule 11.04.2019