首页 文章

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

提问于
浏览
2

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

这种运行速度非常慢,因为每个 Map 迭代都是它自己的工作 . 有没有办法有效地执行此操作,可能使用Mllib中的Statistics.corr,根据this SO Question (Spark 1.6 Pearson Correlation)

1 回答

  • 1

    DataFrame 上有"na"函数:DataFrameNaFunctions API它们的工作方式与 DataFramStatFunctions 相同 . 您可以使用以下语法删除两个数据帧列中任何一个中包含null的行:

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

    如果你想删除任何列中包含null的行,那么它是:myDataFrame.na.drop(“any”)

    通过将数据帧限制为您首先关注的两列,您可以使用第二种方法并避免冗长!

    因此,您的代码将成为:

    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)
    

    希望这对你有所帮助 .

相关问题