【问题标题】:Add header to correlation matrix in Spark将标题添加到 Spark 中的相关矩阵
【发布时间】:2017-10-18 10:18:13
【问题描述】:

我正在使用 apache spark 对 csv 文件应用相关性,当加载数据时,我必须跳过第一行作为数据集中的列的标题,否则我无法加载数据。

我得到了计算的相关性,但是当我得到相关矩阵时,我无法将列名称作为标题添加到新矩阵中。如何获取带有标题的矩阵?这是我尝试过的:

import org.apache.spark.mllib.linalg.{ Vector, Vectors }
import org.apache.spark.mllib.stat.Statistics
import org.apache.spark.mllib.linalg.Matrix
import org.apache.spark.rdd.RDD

val data = sc.textFile(strfilePath).mapPartitionsWithIndex {
  case (index, iterator) => if (index == 0) iterator.drop(1) else iterator
}

val inputMatrix = data.map { line =>
  val values = line.split(",").map(_.toDouble)
  Vectors.dense(values)
}

val correlationMatrix = Statistics.corr(inputMatrix, "pearson")

【问题讨论】:

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


    【解决方案1】:

    在 Spark 2.0+ 中,您可以使用以下命令将 csv 文件加载到数据框中:

    val df = spark.read.option("header", "true").option("inferSchema", "true").csv("filePath")
    

    然后可以计算不同列之间的相关性

    df.stat.corr("col1", "col2", "pearson")
    

    【讨论】:

    • 你的意思是,如果我想操作列,我需要将数据加载为数据框?
    • @MaherHTB 您不需要这样做,但它更容易,因为所有列都根据您的标题指定名称。但是,另一种方法是使用当前方法,只需使用 Source.fromFile(filename).getLines.head 单独从文件中读取标题。
    • 我问你是因为,将 Dataframe 保存到 csv 文件这一事实比将 RDD[Vector] 或矩阵保存在 csv 文件中花费了太多时间。你能告诉我谁是我的吗?如果我使用第二种方法,代码更新以获取带有标题的相关矩阵,非常感谢
    • 不知道为什么会这样。也许您可以尝试另存为 .parquet 文件?无论如何,当文件被保存时,应该可以将其作为 RDD 或数据帧读取。开始时如何创建 csv 文件并不重要。
    猜你喜欢
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多