如何转置RDD或MLLib矩阵,很多新手都不是很清楚。为了帮助大家解决这个问题,下面小编就详细讲解一下。需要的人可以从中学习,希望你能有所收获。
如何转置Spark Mllib或一个RDD的矩阵。Spark Mllib的矩阵有多种形式,分布式的和非分布式的,非分布式的矩阵这里就不提了,因为是基于数组的,所以很简单。虽然分布式存储是基于RDD的,但问题变成了如何转置RDD。
首先,我们来介绍一下什么是转置运算:
根据百科中的定义,交换矩阵的行和列得到的矩阵就是矩阵的转置。
如果要交换一个RDD的军衔,主要思路如下:
1、首先变换RDD,并给每行一个唯一的行号(row,rowIndex)。
2.对于RDD的每一行,它都被转换为(value,colindex)并排序为(colIndex)。tolong,(rowindex,value))
3.执行平面图
4.完成第3步后,我们只需要按照3key分组,按照它的键排序,就可以得到转换后的列顺序。
5.步骤4完成后,我们可以根据每行的rowIndex,value)构造带有下标及其值的新行,从而保证转换后每行的顺序。
到的转换完成。
具体步骤如下:
def transposserowmatrix(m :行矩阵):行矩阵={ 0
val transposedRowsRDD=m . rows . zippwithindex . map { case(row,row index)=row totransposedtriplet(row,rowIndex)}。flat map(x=x)//(new rownindex,(newColIndex,value))。groupByKey。sortByKey()。map(_。_2) //对行进行排序并删除索引。映射(buildRow) //使用索引和值重新构建每一行,并删除索引。
新行矩阵
}
//转换每一行
def rowtortransposedtriplet(row : Vector,rowIndex: Long):数组[(Long,(Long,Double))]={ 0
val index edrow=row . to array . zipcwithindex
indexedRow.map{case (value,colIndex)=(colIndex.toLong,(rowIndex,value))}
}
//创建新行
def buildRow(row withindex : Iterable[(Long,Double)]): Vector={ 0
val resArr=新数组[双精度]
rowWithIndexes.foreach{case(索引,值)=
resArr(index.toInt)=值
}
vectors . density(ReSarr)
}测试
准备数据
val观测值=sc.parallelize(
Seq(
vectors . density(1.0,10.0,100.0,2.0),
向量.密集(2.0,20.0,200.0,2.0),
向量.密集(3.0,30.0,300.0,2.0)
)
)生成矩阵
valmat :行矩阵=新行矩阵(观察)
你会发现军衔已经互换了。
阅读以上内容对你有帮助吗?如果您想了解更多相关知识或阅读更多相关文章,请关注行业资讯频道,感谢您的支持。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/154318.html