溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何將RDD或者M(jìn)LLib矩陣進(jìn)行轉(zhuǎn)置操作

發(fā)布時(shí)間:2021-12-21 13:56:27 來源:億速云 閱讀:259 作者:柒染 欄目:大數(shù)據(jù)

如何將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)

如何將RDD或者M(jìn)LLib矩陣進(jìn)行轉(zhuǎn)置操作

會(huì)發(fā)現(xiàn)行列已經(jīng)互換。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問一下細(xì)節(jié)

免責(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)容。

AI