从 Pyspark 中的数据框中计算空值和非空值

Posted

技术标签:

【中文标题】从 Pyspark 中的数据框中计算空值和非空值【英文标题】:Counting nulls and non-nulls from a dataframe in Pyspark 【发布时间】:2019-05-22 00:59:42 【问题描述】:

我在 Pyspark 中有一个数据框,我想在其上计算列中的空值以及这些相应列的不同值,即非空值

这是我拥有的数据框

trans_date   transaction_id    transaction_id1
2016-01-01     1                  1
2016-01-01     2                 null
2016-01-01     null               3

我想对月份和年份进行聚合并生成类似的东西

| month | year | id_count_in_x_not_in_y | id_count_in_y_not_in_x | ids_in_x | ids_in_y |


df.groupBy(F.month(F.col("trans_date")).alias("MONTH"), \
                            F.year(F.col("trans_date")).alias("YEAR")) \
  .agg(*(F.sum(F.col(c).isNull().cast("int")).alias(c) for c in columns))\
  .show()

这就是我在代码方面所拥有的,但它似乎并没有给我很好的答案。此外,应该如何在同一代码中进行非空计数。 任何帮助,将不胜感激。 谢谢!

【问题讨论】:

请提供预期结果的样本。 【参考方案1】:

首先,按年和月分组。我们可以计算每列中每组的空值和非空值,并在转换为整数后求和;这部分很简单。

对于出现在一列中但不在另一列中的元素的计数,我们可以使用collect_set,它将唯一元素聚合到一个数组中,并结合array_except

from pyspark.sql import functions as F
from pyspark.sql.types import IntegerType

result = (df
     .groupBy(F.year('date').alias('year'), F.month('date').alias('month'))
     .agg(F.sum(F.isnull('x').cast(IntegerType())).alias('x_null'),
          F.sum(F.isnull('y').cast(IntegerType())).alias('y_null'),
          F.sum((~F.isnull('x')).cast(IntegerType())).alias('x_not_null'),
          F.sum((~F.isnull('y')).cast(IntegerType())).alias('y_not_null'),
          F.collect_set('x').alias('x_unique'),
          F.collect_set('y').alias('y_unique'))
     .withColumn('x_not_in_y_count', F.size(F.array_except('x_unique', 'y_unique')))
     .withColumn('y_not_in_x_count', F.size(F.array_except('y_unique', 'x_unique')))
     .drop('x_unique', 'y_unique')
     .orderBy('year', 'month')
)

给定以下测试数据:

+----------+----+----+
|      date|   x|   y|
+----------+----+----+
|1991-01-01|null|   2|
|1991-01-02|   1|null|
|1991-01-03|   2|   3|
|1991-02-01|null|   1|
|1991-02-02|null|   2|
+----------+----+----+

这是输出:

+----+-----+------+------+----------+----------+----------------+----------------+
|year|month|x_null|y_null|x_not_null|y_not_null|x_not_in_y_count|y_not_in_x_count|
+----+-----+------+------+----------+----------+----------------+----------------+
|1991|    1|     1|     1|         2|         2|               1|               1|
|1991|    2|     2|     0|         0|         2|               0|               2|
+----+-----+------+------+----------+----------+----------------+----------------+

【讨论】:

哇,非常感谢。我在做这件事的时候很挣扎。我只有一个问题,我已经通过外部连接获得了您提供的测试数据。因此,获得x_not_in_y_count y_not_in_x_count 不只是空值计数 @ManasJani 你加入什么?我自己制作了测试数据。对不起,我不太明白。 我刚刚加入了我提到的事务ID,然后创建了一个最终的数据框。最终目标基本上是得到有问题的结果数据集。

以上是关于从 Pyspark 中的数据框中计算空值和非空值的主要内容,如果未能解决你的问题,请参考以下文章

Python 空值和非空值

我只需要在 pyspark 数据框中附加那些具有非空值的人

mysql创建表时的空值和非空值设置有啥讲究

数据库数据插入,空值和非空判断,自动排序,约束主键,唯一约束,外健约束

从pyspark的多列中选择非空值

Pyspark 计数非空值之间的空值