拥有一个数据集,并希望使用pyspark进行一些清理。删除所有空值大于75%的列。使用python:
df = df.dropna(axis='columns', thresh = int(0.75 * len(df)))
我如何使用pyspark实现这一目标
答案 0 :(得分:0)
让我们创建一个虚构的DataFrame
。目的是只有一个带有列B,C & D
的DataFrame。
from pyspark.sql.functions import count, when
valuesCol = [(None,21,12,None,1),(8,None,3,1,None),(None,40,None,10,None),(None,2,None,6,None),(None,8,0,2,None)]
df = sqlContext.createDataFrame(valuesCol,['A','B','C','D','E'])
df.show()
+----+----+----+----+----+
| A| B| C| D| E|
+----+----+----+----+----+
|null| 21| 12|null| 1|
| 8|null| 3| 1|null|
|null| 40|null| 10|null|
|null| 2|null| 6|null|
|null| 8| 0| 2|null|
+----+----+----+----+----+
现在,让我们聚合DataFrame并collect()
。 Collect
是action
,它在驱动程序中将DataFrame
的所有元素作为数组返回。
aggregated_row = df.select([(count(when(col(c).isNull(), c))/df.count()).alias(c) for c in df.columns]).collect()
aggregated_row
[Row(A=0.8, B=0.2, C=0.4, D=0.2, E=0.8)]
将Row()
对象转换为list
的{{1}}-
dictionary
最后,使用aggregated_dict_list = [row.asDict() for row in aggregated_row]
aggregated_dict = aggregated_dict_list[0]
{'D': 0.2, 'A': 0.8, 'C': 0.4, 'E': 0.8, 'B': 0.2}
查找那些dictionary comprehensions
值大于总数的75%的列,然后删除这些列-
Null