计算Spark DataFrame上的Spearman相关性

时间:2015-08-24 19:47:33

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

我想对目前在Spark DataFrame中的数据运行Spearman关联。目前,只有Pearson相关性计算可用于对DataFrame中的列进行操作。看来我可以使用Spark的MLlib进行Spearman相关,但我需要将两个RDD [Double]传递给该函数。根据当前架构,我要比较的列是Double。

有没有办法选择我想要的列并使其成为双打数组,以便我可以使用MLlib相关函数来获得Spearman相关系数?

3 个答案:

答案 0 :(得分:1)

您只需选择感兴趣的列,提取值并计算统计数据:

import sqlContext.implicits._
import org.apache.spark.mllib.stat.Statistics

// Generate some random data
scala.util.Random.setSeed(1)
val df = sc.parallelize(g.sample(1000).zip(g.sample(1000))).toDF("x", "y")


// Select columns and extract values
val rddX = df.select($"x").rdd.map(_.getDouble(0))
val rddY = df.select($"y").rdd.map(_.getDouble(0))

val correlation: Double = Statistics.corr(rddX, rddY, "spearman")

答案 1 :(得分:0)

你应该可以做这样的事情

val firstRDD: RDD[Double] = yourDF.select("field1").map(row => row.getDouble(0))
val secondRDD: RDD[Double] = yourDF.select("field2").map(row => row.getDouble(0))
val corr = Statistics.corr(firstRDD, secondRDD, "spearman")

答案 2 :(得分:0)

在scala中,您可以使用以下内容。我假设你正确地从rdd创建了数据帧。

df.select(corr($"Column1",$"Column2")).show()

+----------------------+
|corr(Column1, Column2)|
+----------------------+
| 0.40962234447942202  |
+----------------------+