我目前有一个双精度数据帧,大约有20%的数据是空值。我想计算一列与每隔一列的Pearson相关性,并返回DataFrame中前10列的columnId。
我想使用成对删除来过滤掉空值,类似于其Pearson相关函数中的R" pairwise.complete.obs选项。也就是说,如果任何相关计算中的两个向量之一在索引处为空,我想从两个向量中删除该行。
我目前正在执行以下操作:
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)
这种运行速度非常慢,因为每个地图迭代都是它自己的工作。有没有办法有效地执行此操作,可能使用Mllib中的Statistics.corr,按this SO Question (Spark 1.6 Pearson Correlation)
答案 0 :(得分:1)
有" na" DataFrame
上的函数:DataFrameNaFunctions
API
它们的工作方式与DataFramStatFunctions
相同。
您可以使用以下语法删除两个数据帧列中任何一个中包含null的行:
myDataFrame.na.drop("any", target, colId)
如果你想删除任何列中包含null的行,那么它是: myDataFrame.na.drop("任何&#34)
通过将数据帧限制为您首先关注的两列,您可以使用第二种方法并避免冗长!
因此,您的代码将成为:
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)
希望这会对你有所帮助。