私は現在、データの約20%がヌル値である2倍のデータフレームを持っています。ある列と他の列とのPearson相関を計算し、DataFrameの上位10列のcolumnIdを返したいとします。Spark:欠損値を持つDataFrameの相関を計算する
Pearson相関関数のRのpairwise.complete.obsオプションと同様に、ペアワイズ削除を使用してヌルを除外したいと考えています。つまり、相関演算の2つのベクトルの1つがインデックスにnullを持つ場合、そのベクトルを両方のベクトルから削除したいと考えています。
私は現在、次の操作を行います。一つ一つのマップの反復は、自身の仕事であるよう
val df = ... //my DataFrame
val cols = df.columns
df.registerTempTable("dataset")
val target = "Row1"
val mapped = cols.map {colId =>
val results = sqlContext.sql(s"SELECT ${target}, ${colId} FROM dataset WHERE (${colId} IS NOT NULL AND ${target} IS NOT NULL)")
(results.stat.corr(colId, target) , colId)
}.sortWith(_._1 > _._1).take(11).map(_._2)
これは、非常にゆっくりと実行されます。おそらくありthis SO Question (Spark 1.6 Pearson Correlation)
回答ありがとうTristan! DataFrameNaFunctionsはコードの読みやすさを向上させますが、私が探していたスピードアップは提供しません。現在、分散データ・ソース(cols)を使用して分散データ・フレーム(df)を繰り返し処理しています。理想的には、並列化を最大化するためにcolumnIdを相関値にマッピングするDataFrameで変換を使用したい –