【发布时间】:2023-03-14 23:23:01
【问题描述】:
我目前有一个双精度数据帧,其中大约 20% 的数据是空值。我想计算一列与其他列的 Pearson 相关性,并返回 DataFrame 中前 10 列的 columnId。
我想使用成对删除过滤掉空值,类似于 R 在其 Pearson 相关函数中的 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)
【问题讨论】:
-
spark 默认处理这个问题,当你计算相关性时,它会删除所有具有空值的行
标签: scala apache-spark apache-spark-sql apache-spark-mllib