【问题标题】:Efficient load CSV coordinate format (COO) input to local matrix spark高效加载 CSV 坐标格式 (COO) 输入到本地矩阵 spark
【发布时间】:2018-01-30 15:23:52
【问题描述】:

我想将 CSV 坐标格式 (COO) 数据转换为本地矩阵。目前我首先将它们转换为CoordinateMatrix,然后再转换为LocalMatrix。但是有没有更好的方法来做到这一点?

示例数据:

0,5,5.486978435
0,3,0.438472867
0,0,6.128832321
0,7,5.295923198
0,1,7.738270234

代码:

var loadG = sqlContext.read.option("header", "false").csv("file.csv").rdd.map("mapfunctionCreatingMatrixEntryOutOfRow")
var G = new CoordinateMatrix(loadG)

var matrixG = G.toBlockMatrix().toLocalMatrix()

【问题讨论】:

  • 您最好提供minimal reproducible example(包括示例数据)并解释动机(如果数据对于本地矩阵来说足够小,听起来像 XY 问题和/或过早优化。它是也不清楚你为什么使用 Spark,更不用说本地 linalg 了,有点没用)而不是赏金。
  • 您能否详细说明您想要实现的目标?看起来您只使用 Spark 来解析 CSV 文件,然后在驱动程序上有一个 DenseMatrix。是这样还是有什么遗漏的东西可以帮助社区给出有意义的答案?
  • 是的,我想解析那个 CSV 文件,从数据中创建一个 DenseMatrix 并用这些矩阵做很多线性代数。
  • 我什至必须在循环内进行矩阵乘法/加法元素乘法。 (我必须使用 spark = 学校项目的原因)

标签: scala apache-spark matrix sparse-matrix apache-spark-ml


【解决方案1】:

LocalMatrix 将存储在一台机器上,因此不会利用 Spark 的优势。换句话说,使用 Spark 似乎有点浪费,尽管仍有可能。

将 CSV 文件保存到 LocalMatrix 的最简单方法是首先使用 Scala 而不是 Spark 读取 CSV:

val entries = Source.fromFile("data.csv").getLines()
  .map(_.split(","))
  .map(a => (a(0).toInt, a(1).toInt, a(2).toDouble))
  .toSeq

LocalMatrixSparseMatrix 变体具有读取 COO 格式数据的方法。需要指定行数和列数才能使用它。由于矩阵是稀疏的,因此在大多数情况下应该手动完成,但可以按如下方式获得数据中的最高值:

val numRows = entries.map(_._1).max + 1
val numCols = entries.map(_._2).max + 1

然后创建矩阵:

val matrixG = SparseMatrix.fromCOO(numRows, numCols, entries)

矩阵将以 CSC 格式存储在机器上。打印上面的示例输入将产生以下输出:

1 x 8 CSCMatrix
(0,0) 6.128832321
(0,1) 7.738270234
(0,3) 0.438472867
(0,5) 5.486978435
(0,7) 5.295923198

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-04
    • 2023-03-20
    • 2014-12-21
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    相关资源
    最近更新 更多