scala 计算Spark DataFrame中非空值的数量

zengzsys  于 2022-11-09  发布在  Scala
关注(0)|答案(6)|浏览(291)

我有一个包含一些列的数据框,在进行分析之前,我想了解一下数据框有多完整。因此,我希望过滤 Dataframe 并为每一列计算非空值的数量,可能会返回一个 Dataframe 。
基本上,我正在尝试实现与this question相同的结果,但使用的是Scala而不是Python。
假设您拥有:

val row = Row("x", "y", "z")
val df = sc.parallelize(Seq(row(0, 4, 3), row(None, 3, 4), row(None, None, 5))).toDF()

如何为每列汇总非空值的数量,并返回列数相同且只返回一行结果的 Dataframe 呢?

mrwjdhj3

mrwjdhj31#

一种直接的选择是使用.describe()函数来获取 Dataframe 的摘要,其中计数行包括非空值的计数:

df.describe().filter($"summary" === "count").show
+-------+---+---+---+
|summary|  x|  y|  z|
+-------+---+---+---+
|  count|  1|  2|  3|
+-------+---+---+---+
i5desfxk

i5desfxk2#

尽管我喜欢Psidom Answer,但我通常对空值的分数更感兴趣,因为仅仅是非空值的数量并不能说明太多问题……
您可以执行以下操作:

import org.apache.spark.sql.functions.{sum,when, count}

df.agg(
   (sum(when($"x".isNotNull,0).otherwise(1))/count("*")).as("x : fraction null"),
   (sum(when($"y".isNotNull,0).otherwise(1))/count("*")).as("y : fraction null"),
   (sum(when($"z".isNotNull,0).otherwise(1))/count("*")).as("z : fraction null")
 ).show()

编辑:sum(when($"x".isNotNull,0).otherwise(1))也可以替换为count($"x")count($"x")只计算非空值。因为我发现这并不明显,所以我倾向于使用sum表示法,它更清楚

r6l8ljro

r6l8ljro3#

以下是我在Scala 2.11,Spark 2.3.1中如何做到这一点:

import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._

df.agg(
    count("x").divide(count(lit(1)))
        .as("x: percent non-null")
    // ...copy paste that for columns y and z
).head()

count(*)计算非空行,count(1)在每一行上运行。
如果您想要计算人口中的百分比,请找到我们基于计数的公式的补码:

lit(1).minus(
    count("x").divide(count(lit(1)))
    )
    .as("x: percent null")

同样值得知道的是,您可以将空值转换为整数,然后对其求和
但它的表现可能不那么出色:

// cast null-ness to an integer
sum(col("x").isNull.cast(IntegerType))
    .divide(count(lit(1)))
    .as("x: percent null")
wmvff8tz

wmvff8tz4#

下面是最简单的查询:

d.filter($"x" !== null ).count
mbyulnm0

mbyulnm05#

df.select(df.columns map count: _*)

df.select(df.columns map count: _*).toDF(df.columns: _*)
3pvhb19x

3pvhb19x6#

Spark 2.3+

(适用于字符串和数字类型列)

df.summary("count").show()
+-------+---+---+---+
|summary|  x|  y|  z|
+-------+---+---+---+
|  count|  1|  2|  3|
+-------+---+---+---+

相关问题