您好,登錄后才能下訂單哦!
如何將RDD或者M(jìn)LLib矩陣進(jìn)行轉(zhuǎn)置操作,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
如何將Spark Mllib的矩陣或者將一個(gè)RDD進(jìn)行轉(zhuǎn)置操作。Spark Mllib的矩陣有多種形式,分布式和非分布式,非分布式在這里浪尖就不講了,很簡單,因?yàn)樗腔跀?shù)組的。而分布式存儲(chǔ)是基于RDD的,那么問題就又變成了如何將一個(gè)RDD進(jìn)行轉(zhuǎn)置。
首先我們來介紹一下什么是轉(zhuǎn)置操作:
百科上的定義,將一個(gè)矩陣的行列互換得到的矩陣就是該矩陣的轉(zhuǎn)置。
要想把一個(gè)RDD的行列互換的話,主要思路如下:
1,先轉(zhuǎn)化RDD,給每一行帶上唯一的行號(hào)(row, rowIndex)。
2,針對(duì)RDD的每一行,轉(zhuǎn)化為(value, colIndex),并整理的到(colIndex.toLong, (rowIndex, value))
3,進(jìn)行flatmap
4,步驟3完成后,我們只需要按照3key進(jìn)行分組,并按照其key進(jìn)行排序就可以得到轉(zhuǎn)化后列式有序。
5,完成步驟4后,我們就可以按照每一行的(rowIndex, value),使用下標(biāo)和其值構(gòu)建新的行,保證每一行轉(zhuǎn)換后的順序。
到此轉(zhuǎn)換完成。
具體步驟如下:
def transposeRowMatrix(m: RowMatrix): RowMatrix = {
val transposedRowsRDD = m.rows.zipWithIndex.map{case (row, rowIndex) => rowToTransposedTriplet(row, rowIndex)}
.flatMap(x => x) // (newRowIndex, (newColIndex, value))
.groupByKey
.sortByKey().map(_._2) // 對(duì)row進(jìn)行排序,去除掉索引
.map(buildRow) // 利用索引和值,重新構(gòu)建每一行,去掉索引
new RowMatrix(transposedRowsRDD)
}
//轉(zhuǎn)換每一行
def rowToTransposedTriplet(row: Vector, rowIndex: Long): Array[(Long, (Long, Double))] = {
val indexedRow = row.toArray.zipWithIndex
indexedRow.map{case (value, colIndex) => (colIndex.toLong, (rowIndex, value))}
}
//構(gòu)建新的行
def buildRow(rowWithIndexes: Iterable[(Long, Double)]): Vector = {
val resArr = new Array[Double](rowWithIndexes.size)
rowWithIndexes.foreach{case (index, value) =>
resArr(index.toInt) = value
}
Vectors.dense(resArr)
}
測試
準(zhǔn)備數(shù)據(jù)
val observations = sc.parallelize(
Seq(
Vectors.dense(1.0, 10.0, 100.0,2.0),
Vectors.dense(2.0, 20.0, 200.0,2.0),
Vectors.dense(3.0, 30.0, 300.0,2.0)
)
)
生成矩陣
val mat: RowMatrix = new RowMatrix(observations)
會(huì)發(fā)現(xiàn)行列已經(jīng)互換。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。