2016-07-20 19 views
2

私は現在、データの約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)

答えて

1

あたりとして、MllibでStatistics.corrを使用して、これを効率的に行うための方法はありDataFrameの機能「NA」:彼らはDataFramStatFunctionsが行うのと同じように動作DataFrameNaFunctions API 。 次の構文を使用して2つのデータフレームの列のいずれかにNULLを含む行をドロップすることができます。

myDataFrame.na.drop("any", target, colId) 

あなたは列のヌルいずれかを含む行を削除する場合、それは次のとおりです。 myDataFrame.na.drop ( "any")

データフレームを気にする2つの列に限定することで、第2の方法を使用して詳細を避けることができます。あなたのコードになるでしょう。このよう

:これはあなたを助け

val df = ??? //my DataFrame 
val cols = df.columns 
val target = "Row1" 
val mapped = cols.map {colId => 
    val resultDF = df.select(target, colId).na.drop("any") 
    (resultDF.stat.corr(target, colId) , colId) 
    }.sortWith(_._1 > _._1).take(11).map(_._2) 

希望。

+0

回答ありがとうTristan! DataFrameNaFunctionsはコードの読みやすさを向上させますが、私が探していたスピードアップは提供しません。現在、分散データ・ソース(cols)を使用して分散データ・フレーム(df)を繰り返し処理しています。理想的には、並列化を最大化するためにcolumnIdを相関値にマッピングするDataFrameで変換を使用したい –