【问题标题】: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)
        

        【讨论】:

          猜你喜欢
          • 2014-04-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-03
          • 1970-01-01
          • 2023-03-26
          • 2019-08-05
          • 1970-01-01
          相关资源
          最近更新 更多