计算行均值,忽略Spark Scala中的NAs

时间:2017-04-03 08:19:23

标签: scala apache-spark dataframe aggregation

我正在尝试找到一种方法来计算Scala中Spark Dataframe中的平均值,我想忽略NAs。在R中,有一个非常方便的函数叫做rowMeans,可以指定忽略NAs:

rowmeans(df,na.rm=TRUE)

我无法找到Spark Dataframes的相应功能,我想知道是否有人有建议或输入,如果可能的话。用0替换它们将不会到期,因为这会影响分母。

我发现了一个类似的问题here,但我的数据框将有数百列。

欢迎任何帮助和分享见解,欢呼!

2 个答案:

答案 0 :(得分:1)

通常这些函数默认忽略空值。 即使有一些带有数字和字符串类型的混合列,这个也会丢弃字符串和空值,并且只计算数值。

df.select(df.columns.map(c => mean(col(c))) :_*).show

答案 1 :(得分:-1)

您可以通过首先确定哪些字段是数字,然后为每行选择它们的均值来实现此目的...

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

val df = List(("a",1,2,3.0),("b",5,6,7.0)).toDF("s1","i1","i2","i3")

// grab numeric fields
val numericFields = df.schema.fields.filter(f => f.dataType==IntegerType || f.dataType==LongType || f.dataType==FloatType || f.dataType==DoubleType || f.dataType==ShortType).map(_.name)

// compute mean
val rowMeans = df.select(numericFields.map(f => col(f)).reduce(_+_) / lit(numericFields.length) as "row_mean")

rowMeans.show