У меня есть образец кадра данных 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? Ниже приведена конфигурация моего сервера.
ОБНОВЛЕННЫЙ СКРИНШОТ
spark_df.summary('count')
, чтобы найти ненулевые значения, а затем использовать spark_df.count() для расчета количества значений null/nan? - person jxc   schedule 24.10.2019spark_df.summary('count')
, я получаю только приведенный выше вывод (см. сообщение). Это ожидается? Как я могу вычесть это со счетом? Разве я не должен ожидать увидетьvalue
? - person The Great   schedule 29.10.2019df.summary()
проверяет только числовые и строковые столбцы (такие типы, как DateType, TimestampType, ArrayType и т. д., пропускаются. Будьте осторожны с этим ограничением). Кроме того, все числа имеют тип StringType, и вам нужно будет преобразовать их вint
. всего nrowsN=df.count()
. вы можете выполнить окончательный расчет в Pandas или просто в цикле Pythonfor
. - person jxc   schedule 30.10.2019