首页 > 解决方案 > 如何将 BlockMatrix(org.apache.spark.mllib.linalg.distributed.BlockMatrix) 保存到 hdfs 或本地?

问题描述

我正在尝试使用 spark 计算大图的所有对最短路径。我使用来自 github 的代码,计算结果(距离矩阵)保存在 BlockMatrix(org.apache.spark.mllib.linalg .distributed.BlockMatrix).我想知道如何将结果保存到hdfs或本地,以便下次我可以快速分析结果而无需再次计算。

现在我只是使用无向图(4038个节点)来测试代码。我尝试用下面的代码解决问题。但是这些方法还不够好。

1.将BlockMatrix转换为LocalMatrix,然后使用toString方法将结果保存到本地文件。当图足够大时,结果字符串会太大,会出现OutOfMemoryError: Java heap space错误

2.用blocks方法将BlockMatrix转换为RDD,然后保存Astextfile,结果文件的格式不方便阅读和分析。

所以想问问有没有什么聪明的办法来保存BlockMatrix,这样我就可以用最少的代码完成结果的保存和读取。

//first way
val resfile = new PrintWriter(new File("result.txt"))
resfile.write(result.toLocal().toString(Int.MaxValue, Int.MaxValue))
resfile.close()
//second way
result.distMatrix.blocks.saveAsTextFile("hdfs://master:9000/result")

标签: scalaapache-spark

解决方案


String.length 是一个 Integer,所以当 Matrix 足够大时,使用 Matrix.toString 会导致错误(Java OutOfMemory)。toString 方法的存在让我忘记了存储 BlockMatrix 的基本方法。

其实很简单。我们只需要将BlockMatrix 转换为 localMatrix,然后使用Matrix.apply 方法访问每个元素并将它们写入本地文件。


推荐阅读