1. 程式人生 > >spark分散式矩陣採坑記

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實現,本人首先嚐試了使用笛卡爾積的方式,發現執行速度超慢。後改為將小的矩陣做成廣播變數,執行速度很快。解決了上述問題。

相關推薦

spark分散式矩陣

    最近在開發一版基於協同過濾演算法的推薦系統,需要用到歷史7天的搜尋和所有歷史訂單資料,幾十億的資料參與運算。採用spark2.0.2版本的mllib.linalg.distributed模組。該模組包含BlockMatrix,CoordinateMatrix,Inde

leetcode add_binary

儘管add_binary在leetcode中是一個簡單難度,但是踩了不少坑,記錄一下 描述: 給兩個字串形式的二進位制數,要求求和並輸出字串形式的結果,其中a和b均不為空字串 樣例: a=“1010”,b="1011",輸出“10101”.   過程: 剛看到題目的時候覺得很簡單,只要

mpvue——專案搭建

專案搭建 簡介 1、安裝node 2、配置npm源為淘寶映象 3、全域性安裝 vue-cli 4、建立一個基於 mpvue-quickstart 模板的新專案 5、安裝依賴 6、啟動構建

springboot結合jsp

網上找了一圈都沒有解決自己的問題 Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Wed Nov 21 16:

小程式 mpvue + Vant Weapp

最新在做一個小程式專案,框架使用的是:mpvue + Vant Weapp;其餘還用的技術棧:vue.js、微信小程式、網路庫flyio等。 mpvue是美團開源的微信小程式框架,由於無限接近vue開發而受到大量關注; Vant Weapp UI庫是輕量、可靠的小程式 UI 元件庫,是

github —— 專案提交到github後部分檔案缺失

在使用git push到GitHub上後,發現部分檔案缺失,如下圖所示: 可以看到dist資料夾為 執行 npm run build 之後打包生成的檔案,node_modules 檔案也是缺失的 導致檔案沒有提交的原因是在專案根目錄下有個檔案:   開啟檔案: 可以看

Service worker (@nuxtjs/workbox)

PWA(Progressive Web App)是前端的大趨勢,它能極大的加快前端頁面的載入速度,得到近乎原生 app 的展示效果(其實難說)。PWA 其實是多種前端技術的組合,其中最重要的一個技術就是 service worker。 Service worker

ionic cordova-plugin-pingapp

需求:ionic3專案使用p++對接支付寶,微信支付。 1.安裝h5sdk,實現wap支付 安裝:npm install pingpp-js 使用語法:  宣告:public pingpp=require('pingpp-js'); 支付:this.pingpp.cre

ionic專案升級環境(1)

為了專案需要,升級環境,npm更新完成之後。ionic serve執行報錯: Property 'toPromise' does not exist on type 'Observable<Response>'. 重新整理之後報錯:  webpackJsonp is no

streaming流式讀取hdfs

package rockerMQ import org.apache.spark.sql.SparkSession import org.apache.spark.{SparkConf, SparkContext, sql} import org.apache.spark.streaming.{

阿里雲深度學習

原因 打算研究下AI,以便不那麼落後於這個時代,但是看了看,搞一個能支援AI演算法的顯示卡就要天文數字。所以找到了阿里雲的PAI平臺,打算跑跑自己寫的演算法,採坑無數,搞了兩天才搞定。 基本流程 踩過的坑(需要注意事項) 資料檔案 自己寫的python程式碼本身讀取資料和儲存模型都在本地,可能做了硬編碼,如

小程式(四) picker元件

從底部彈起的滾動選擇器,現支援五種選擇器,通過mode來區分,分別是普通選擇 器,多列選擇器,時間選擇器,日期選擇器,省市區選擇器,預設是普通選擇器。 普通選擇器:mode = selector 後臺給我返回的是一個數組物件,我需要的range資料是這個陣列物

小程式(五) 動態改變資料

專案當時有個需求是,在詳情頁面點選關注,要把關注的內容傳給首頁顯示出來,開始的時候,我以為是把資料傳給後臺,顯示關注成功就可以了,這樣只能實現頁面重新整理時,可以在首頁顯示關注的內容,但是需求不是這樣的,是要在點選了關注後,返回首頁時就顯示出來,沒有重新整理,也

https信任庫

最近在客戶現場遇到一個棘手的http問題,現象很直接,訪問某https的時候報錯: javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated at sun.security.ssl.SSLSessionImpl.

Taro小程式

小編推薦:Fundebug專注於JavaScript、微信小程式、微信小遊戲,Node.js和Java實時BUG監控。真的是一個很好用的bug監控費服務,眾多大佬公司都在使用。 Taro,京東凹凸實驗室出品的適配多端的一個框架,Taro 是一套遵循 React 語法規範的 多端開發

pomelo使用(學習使用部署相關)

pomelo推送方式 pomelo和客戶端保持長連結,推送可以根據頻道推送或者根據使用者連線的伺服器推送 頻道推送 建立頻道 let channel = this.app.get('channelService').getChannel(channelNa

按照當前日期的前一小時讀取hdfs Calendar.HOUR_OF_DAY

只讀到23點的資料  讀不到00點 看程式碼發現是這裡寫錯了 //獲取前一個小時 24小時制Calendar.HOUR_OF_DAY def getFrontHour(): String = { var dateFormat: SimpleDateForma

Universal Link 前端部署

轉載自: http://awhisper.github.io/2017/09/02/universallink/號外!號外!微信已經封禁Universal Link,已經不能實現跳出微信開啟App具體細節可以看但Univeral Link 還是可以學習學習看看的~畢竟幾遍在S

Redis手動編譯安裝——(重點解決缺失jemalloc.h)

Redis-4.0.10手動編譯安裝——採坑記(重點解決缺失jemalloc.h) 一、前期準備 mkdir /app yum install -y gcc wget wget http://download.redis.io/releases/redi

NLP資料處理

reload(sys)#sys.setdefaultencoding('utf8') 在Python 3.X 中沒有了可以改成open('path',encoding = 'utf-8') 這樣的形式