当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《计算SparkDataFrame中的非空值的数量》经验,为你挑选了2个好方法。

我有一个带有一些列的数据框,在进行分析之前,我想了解这样的数据框是多么完整,所以我想过滤数据帧并为每列计算非空值的数量,可能返回数据帧回来了.

基本上,我试图获得与此问题中表达的相同的结果,但使用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()

如何汇总每列的非空数并返回具有相同列数的数据帧,只返回一行的答案?



1> Psidom..:

一个直接的选项是使用.describe()函数来获取数据框的摘要,其中count行包含非空值的计数:

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



2> Raphael Roth..:

尽管我喜欢Psidoms的答案,但通常我对空值的分数更感兴趣,因为仅非空值的数量并不能说明很多问题。

您可以执行以下操作:

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")非空值代替。因为我发现这并不明显,所以我倾向于使用sum更清晰的表示法

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有