我正在尝试找到一种方法来计算Scala中Spark Dataframe中行的平均值,我想忽略NAs。在R中,有一个非常方便的函数叫做rowMeans,可以指定忽略NAs:
rowmeans(df,na.rm=TRUE)
我无法找到Spark Dataframes的相应功能,我想知道是否有人有建议或输入,如果可能的话。用0替换它们将不会到期,因为这会影响分母。
我发现了一个类似的问题here,但我的数据框将有数百列。
欢迎任何帮助和分享见解,欢呼!
答案 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