Spark:计算DataFrame与缺失值的相关性

时间:2016-07-20 19:53:02

标签: scala apache-spark apache-spark-sql apache-spark-mllib

我目前有一个双精度数据帧,大约有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)

1 个答案:

答案 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)

希望这会对你有所帮助。