我有一个dataframe,需要查看它是否包含空值。有很多关于同一主题的文章,但几乎所有的文章都使用count操作或show方法。
在我的例子中,count操作非常昂贵,因为数据量很大。show方法也是如此。
是否有一种方法,当火花遇到第一个空值时,可以要求它查找空值并引发错误?
其他帖子中的解决方案给出了每一列中缺失值的计数。我不需要知道每一列中缺少的值的数量。我只想知道dataframe中是否有空值的单元格。
发布于 2019-05-03 06:22:16
你可以使用limit
df.select("*").where(col("c").isNull()).limit(1)发布于 2019-05-03 06:59:17
您可能需要遍历所有值并检查空值。这可以通过按列或行的方式遍历dataframe。哪一个是最好的取决于数据(使用启发式)。
逐行遍历:
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按列遍历(根据经验,此应该更快,请参见按时钟从注释):
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
breaklimit(1)用于在找到第一个空值时停止,collect().isEmpty用于检查数据是否为空。
发布于 2019-05-03 06:29:45
据我所知,如果任何列都为null,则您的要求是只升起标志。您不需要知道所有实际行都具有空值。
解决方案:我能想到的最简单的方法就是为您的tempView创建一个DataFrame,并在所有可能的情况下检查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现在使用您想要的标志。
你好,Anupam
https://stackoverflow.com/questions/55964196
复制相似问题