spark分布式矩阵采坑记

    最近在开发一版基于协同过滤算法的推荐系统,需要用到历史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 contains SparseMatrix, they willhave to be converted to a DenseMatrix.The output BlockMatrix will only consist of blocks of DenseMatrix. This maycause some performance issues until support for multiplying two sparse matricesis added.

就是两个相乘的矩阵必须都是稠密的,因为结果中之会包含稠密矩阵的Block。但是其它几种矩阵的toBlockMatrix()方法,转成的都是稀疏矩阵。这里spark出现了自相矛盾的情况。

解决方法:

    上述两个算法都可以通过spark core实现,本人首先尝试了使用笛卡尔积的方式,发现运行速度超慢。后改为将小的矩阵做成广播变量,运行速度很快。解决了上述问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值