如何高效地在PySpark数据框中找到每列的Null和Nan值的数量?

108
import numpy as np

data = [
    (1, 1, None), 
    (1, 2, float(5)), 
    (1, 3, np.nan), 
    (1, 4, None), 
    (1, 5, float(10)), 
    (1, 6, float("nan")), 
    (1, 6, float("nan")),
]
df = spark.createDataFrame(data, ("session", "timestamp1", "id2"))

期望输出

每列nan/null计数的数据框

注意:我在Stack Overflow上发现的之前的问题只检查null而不是nan,这就是为什么我创建了一个新的问题。

我知道我可以使用Spark中的isnull()函数来查找Spark列中Null值的数量,但如何在Spark数据框中找到Nan值呢?


有没有关于 scala 的解决方案? - DachuanZhao
12个回答

0
from pyspark.sql import DataFrame
import pyspark.sql.functions as fn

# compatiable with fn.isnan. Sourced from
# https://github.com/apache/spark/blob/13fd272cd3/python/pyspark/sql/functions.py#L4818-L4836
NUMERIC_DTYPES = (
    'decimal',
    'double',
    'float',
    'int',
    'bigint',
    'smallilnt',
    'tinyint',
)


def count_nulls(df: DataFrame) -> DataFrame:
    isnan_compat_cols = {c for (c, t) in df.dtypes if any(t.startswith(num_dtype) for num_dtype in NUMERIC_DTYPES)}

    return df.select(
        [fn.count(fn.when(fn.isnan(c) | fn.isnull(c), c)).alias(c) for c in isnan_compat_cols]
        + [fn.count(fn.when(fn.isnull(c), c)).alias(c) for c in set(df.columns) - isnan_compat_cols]
    )

在gench和user8183279的答案基础上进行构建,但仅通过isnull检查那些不可能使用isnan的列,而不是忽略它们。

pyspark.sql.functions的源代码似乎是我能找到的唯一记录这些名称的文档 - 如果其他人知道一些公共文档,我会很高兴


0
这里有一种方法可避免使用isnanisNull时出现的任何问题,并且可处理任何数据类型。
# spark is a pyspark.sql.SparkSession object

def count_nulls(df: ):
    cache = df.cache()

    row_count = cache.count()
    return spark.createDataFrame(
        [[row_count - cache.select(col_name).na.drop().count() for col_name in cache.columns]],
        # schema=[(col_name, 'integer') for col_name in cache.columns]
        schema=cache.columns
    )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接