2017-04-03 6 views
1

の平均をScalaのSpark Dataframeで計算して、どこでNAを無視したいのかを見つけようとしています。 Rでは、1は、NASを無視するように指定することができますrowMeansと呼ばれる非常に便利な機能があります:Spark ScalaのNAsを無視して行平均を計算する

rowmeans(df,na.rm=TRUE) 

は私には、Sparkデータフレームのための対応する関数を見つけることができませんよ、と誰もがあれば提案や入力を持っているのだろうかこれは可能です。これを分母に反映させるので、それらを0に置き換えることは間に合わない。

私のデータフレームには何百もの列がありますが、同様の質問があります。hereです。

ヘルプと共有の洞察力は高く評価されています。

答えて

2

通常、このような関数はデフォルトでnullを無視します。 数値型と文字列型の混在した列があっても、これは文字列とNULLを削除し、数値のみを計算します。

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

こんにちは、はい、それは私が述べたように動作しますが、もう一度動作します。私たちがゼロを満たすと、これは分母に影響を与え、計算された手段がバイアスされるようになります。そして、私の場合と同様に、私は総計したい約1500の列を持ち、reduce文で合計する列を言うのは非常に不可能です。結論として、多数の列に対して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