最近在开发一版基于协同过滤算法的推荐系统,需要用到历史7天的搜索和所有历史订单数据,几十亿的数据参与运算。采用spark2.0.2版本的mllib.linalg.distributed模块。
该模块包含BlockMatrix,CoordinateMatrix,IndexedRowMatrix,RowMatrix四种矩阵,各矩阵之间可通过BlockMatrix相互转化,BoockMatrix矩阵实现了矩阵乘法,CoordinateMatrix实现了各维度间的余弦相似度,后发现该模块有以下问题待完善:
1. CoordinateMatrix 的columnSimilarities()方法用来计算每两列之间的余弦相似度,原始数据为n*31的矩阵,计算每两列的余弦相似度,理论上得到一个31*31的对称矩阵,对角线值为1(相同维度余弦相似度为1),及31*31=961个值,实际得到的是一个上三角稀疏矩阵,只有465个值,后续如果直接使用该矩阵运算就会造成维度减少以及数据不准确的问题。
2. BlockMatrix multiply求矩阵乘法时,官网上给出下面一段注释
If
other
containsSparseMatrix
, they willhave to be converted to aDenseMatrix
.The output BlockMatrix will only consist of blocks ofDenseMatrix
. This maycause some performance issues until support for multiplying two sparse matricesis added.就是两个相乘的矩阵必须都是稠密的,因为结果中之会包含稠密矩阵的Block。但是其它几种矩阵的toBlockMatrix()方法,转成的都是稀疏矩阵。这里spark出现了自相矛盾的情况。
解决方法:
上述两个算法都可以通过spark core实现,本人首先尝试了使用笛卡尔积的方式,发现运行速度超慢。后改为将小的矩阵做成广播变量,运行速度很快。解决了上述问题。
spark分布式矩阵采坑记
最新推荐文章于 2021-05-12 22:28:58 发布