【问题标题】:Check whether dataframe contains any null values检查数据框是否包含任何空值
【发布时间】:2019-09-21 16:03:27
【问题描述】:
我有一个数据框,需要查看它是否包含空值。有很多关于同一主题的帖子,但几乎所有帖子都使用count 操作或show 方法。
count 操作在我的情况下非常昂贵,因为数据量很大。 show 方法也一样。
有没有一种方法可以让 spark 查找空值并在遇到第一个空值时立即引发错误?
其他帖子中的解决方案给出了每列中缺失值的计数。我不需要知道每列中缺失值的数量。
我只想知道数据框中是否有任何单元格具有空值。
【问题讨论】:
标签:
python
apache-spark
dataframe
pyspark
【解决方案1】:
您必须潜在地遍历所有值并检查空值。这可以通过以列方式或行方式遍历数据帧来完成。哪一个最好取决于数据(使用启发式)。
逐行遍历:
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 用于检查数据框是否为空。
【解决方案2】:
据我了解,您的要求是如果任何列为空,则只需升旗。您不需要知道哪些所有实际行都为空。
解决方案:
我能想到的最简单的方法是创建 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
现在随心所欲地使用标志。
问候,
阿努潘
【解决方案3】:
您可以为此使用limit
df.select("*").where(col("c").isNull()).limit(1)