scala - 如何将 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")
解决方案
String.length 是一个 Integer,所以当 Matrix 足够大时,使用 Matrix.toString 会导致错误(Java OutOfMemory)。toString 方法的存在让我忘记了存储 BlockMatrix 的基本方法。
其实很简单。我们只需要将BlockMatrix 转换为 localMatrix,然后使用Matrix.apply 方法访问每个元素并将它们写入本地文件。
推荐阅读
- javascript - 从比较中列出清单
- javascript - DiscordJS:检查输入是否在字符串中
- php - MySQLi 已启用但未在 Windows Server 2008 中加载
- node.js - 如何在 node.js 中的一台服务器上运行多个多人游戏(服务器)
- python - list1 在我的代码中的任何地方都不会被分配等于 list2,但是 list1 的值仍然被复制到 list2
- android - 当只有一个建议时,AutoCompleteTextView 建议隐藏在键盘下
- javascript - 更新 async forEach 以根据来自另一个集合的属性更新每个文档属性
- javascript - 使用地图获取数组中每个项目的数量
- reactjs - 如何使用 React 的 CSSTransitionGroup 淡入/淡出我的警报消息?
- javascript - 从序列化为 JSON 的 Django 对象中提取值的问题