【问题标题】:Spark: Computing correlations of a DataFrame with missing valuesSpark:计算具有缺失值的 DataFrame 的相关性
【发布时间】: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


【解决方案1】:

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

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

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

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

因此,您的代码将变为:

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)

希望对你有所帮助。

【讨论】:

  • 感谢特里斯坦的回答!虽然 DataFrameNaFunctions 提高了我的代码的可读性,但它并没有提供我一直在寻找的加速。目前,我正在使用非分布式数据源(cols)迭代分布式数据帧(df)。理想情况下,我想在我的 DataFrame 上使用将 columnId 映射到相关值的转换,以最大化并行化
猜你喜欢
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-31
  • 1970-01-01
  • 2017-02-12
相关资源
最近更新 更多