2017-01-20 61 views
1

我有一个数据框,有一些列,在进行分析之前,我想了解这个数据框是多完整的,所以我想过滤数据框并为每列计算非空值的数量,可能会返回一个数据帧。计算Spark 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() 

你怎么能概括的非数 - 对于每一列都是空的,并且返回一个具有相同列数的数据框,并且只有一行包含答案?

+0

非常感谢万亩如果你能分享一些片段来更好地理解你提出的逻辑,我会很感激的:我可以编写一个UDF来做到这一点,但我没有得到如何编写一个代码来执行每列的UDF – user299791

回答

1

虽然我很喜欢Psidoms答案,我常常“M更感兴趣的是空值的一小部分,因为就在非空值的数量并没有告诉太多......

你可以这样做:

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

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

@ user299791忘记提及进口 –

5

一个简单的选择是使用.describe()功能,让您的数据帧,该数列包括非空值的计数的摘要:

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

这只适用于数字列,不适用于String ...对吗? – user299791

+0

嗯。确实。它只适用于数字列。 – Psidom