我有一个数据框,需要查看它是否包含空值。关于同一主题的文章很多,但几乎所有文章都使用count
操作或show
方法。
count
操作非常昂贵,因为数据量很大。与show
方法相同。
有没有一种方法可以让spark在遇到第一个空值时立即查找空值并引发错误?
其他帖子中的解决方案给出了每列中缺失值的计数。我不需要知道每一列中缺失值的数量。 我只想知道数据框中是否有一个值为空的单元格。
答案 0 :(得分:2)
您可能必须检查所有值并检查空值。这可以通过以列方式或行方式遍历数据帧来完成。哪一个最佳取决于数据(使用启发式)。
行遍历:
import pyspark.sql.functions as f
from functools import reduce
df.where(reduce(lambda x, y: x | y, (f.col(x).isNull() for x in df.columns))).limit(1).collect().isEmpty
逐列遍历(根据经验,此应该更快,请参见Clock Slave的评论)
import pyspark.sql.functions as f
contains_nulls = False
for c in df.columns:
if not df.where(f.col(c).isNull()).limit(1).collect().isEmpty:
contains_nulls = True
break
limit(1)
用于在找到第一个空值时停止,并collect().isEmpty
用于检查数据帧是否为空。
答案 1 :(得分:1)
您可以为此使用limit
df.select("*").where(col("c").isNull()).limit(1)
答案 2 :(得分:0)
据我了解,您的要求是,如果任何列为空,则只举标志。您不需要知道所有实际的行都为空。
解决方案: 我可以想到的最简单的方法是为您的DataFrame创建一个tempView并尽可能地检查是否为null。这是该代码的伪代码-
YourDF.createOrReplaceTempView("tempView")
tempViewDF = sqlContext.sql("SELECT count(*) FROM tempView WHERE Col1 is null or Col2 is null or col3 is null")
flag=flase
if tempViewDF > 0:
flag=true
现在根据需要使用标志。
关于, 阿努帕姆