2017-04-03 70 views
1

我試圖找到一種方法來計算在我想忽略NDA的Scala中的Spark Dataframe中的的平均值。在R,有一個叫rowMeans非常方便的功能,其中一個可以指定忽視的NA:計算行平均值,忽略Spark Scala中的NGA

rowmeans(df,na.rm=TRUE) 

我無法找到星火Dataframes相應的功能,我想知道如果任何人有一個建議或者如果輸入這將是可能的。用0代替它們不會到期,因爲這會影響分母。

我發現了一個類似的問題here,但是我的數據框會有數百個列。

任何幫助和共享見解表示讚賞,歡呼!

回答

2

通常這些函數默認情況下忽略空值。 即使有一些帶有數字和字符串類型的混合列,這一個將會刪除字符串和空值,並且只計算數字。

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

謝謝您的輸入。但是,我正在尋找一種方法來計算數據框中行的平均值。 – Chooan

+0

Sry,我把列與列混淆。那麼對於行來說也很容易。首先我們用0填充空值,然後計算平均值列。 val df_filled = df.na.fill(「0」); val nrow = n; (c1,c2)=>(c1 + c2)/ nrow));我們可以通過下面的公式 sumDF.show() –

+0

嗨,是的,這將工作,但後來再次如我所述;如果我們用零填充NA,這將影響計算平均值的分母,如果我假設它是如何計算的話。就我的情況而言,我將要總結大約1500列,使得很難說哪些列與減少陳述相同。因此,最後,我需要對行進行求和並計算其中NAs沒有考慮到大量列的平均值。簡單的事情,但在同一時間不.. – Chooan

0

可以通過先確定哪些領域是數字,然後選擇它們的平均值爲每行做到這一點...

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