Как оптимизировать процентную проверку и падение столбцов в большом фрейме данных pyspark?

У меня есть образец кадра данных pandas, как показано ниже. Но мои реальные данные 40 million rows and 5200 columns

 df = pd.DataFrame({
'subject_id':[1,1,1,1,2,2,2,2,3,3,4,4,4,4,4],
'readings' : ['READ_1','READ_2','READ_1','READ_3',np.nan,'READ_5',np.nan,'READ_8','READ_10','READ_12','READ_11','READ_14','READ_09','READ_08','READ_07'],
 'val' :[5,6,7,np.nan,np.nan,7,np.nan,12,13,56,32,13,45,43,46],
 })

from pyspark.sql.types import *
from pyspark.sql.functions import isnan, when, count, col

mySchema = StructType([ StructField("subject_id", LongType(), True)\
                       ,StructField("readings", StringType(), True)\
                       ,StructField("val", FloatType(), True)])

spark_df = spark.createDataFrame(df,schema=mySchema)

spark_df.select([((count(when(isnan(c)|col(c).isNull(), c))/spark_df.count())*100).alias(c) for c in spark_df.columns]).show()

Приведенный выше код помогает мне получить файл percentage of nulls/nan in each column. Но когда я запускаю то же самое на своих реальных данных, код работает уже давно, но пока не выводит. Как мне оптимизировать этот поиск и удалить столбцы, которые содержат 80 % пустых значений или nan? Ниже приведена конфигурация моего сервера.

введите здесь описание изображения

ОБНОВЛЕННЫЙ СКРИНШОТ

введите здесь описание изображения


person The Great    schedule 24.10.2019    source источник
comment
можете ли вы запустить spark_df.summary('count'), чтобы найти ненулевые значения, а затем использовать spark_df.count() для расчета количества значений null/nan?   -  person jxc    schedule 24.10.2019
comment
@jxc - Но это тоже требует времени, а результата пока нет. Я думал, что pyspark обычно быстр. Разве это не обычная функция счета?   -  person The Great    schedule 24.10.2019
comment
Да, это обычная функция подсчета, но таким образом вы снова и снова подсчитываете фрейм данных.   -  person Rahul    schedule 24.10.2019
comment
По моим данным, он работал 2 часа 32 минуты. Есть ли какой-либо эффективный подход, который может дать быстрые результаты для моих данных?   -  person The Great    schedule 24.10.2019
comment
@jxc - Когда я запускал spark_df.summary('count'), я получаю только приведенный выше вывод (см. сообщение). Это ожидается? Как я могу вычесть это со счетом? Разве я не должен ожидать увидеть value?   -  person The Great    schedule 29.10.2019
comment
@SSMK, df.summary() проверяет только числовые и строковые столбцы (такие типы, как DateType, TimestampType, ArrayType и т. д., пропускаются. Будьте осторожны с этим ограничением). Кроме того, все числа имеют тип StringType, и вам нужно будет преобразовать их в int. всего nrows N=df.count(). вы можете выполнить окончательный расчет в Pandas или просто в цикле Python for.   -  person jxc    schedule 30.10.2019