[英]Transform RDD into RowMatrix for PCA
我擁有的原始數據如下所示:
RDD數據:
鍵->索引
1-> 2
1-> 3
1-> 5
2-> 1
2-> 3
2-> 4
如何將RDD轉換為以下格式?
鍵-> index1,index2,index3,index4,index5
1-> 0,1,1,0,1
2-> 1,0,1,1,0
我當前的方法是:
val vectors = filtered_data_by_key.map( x => {
var temp = Array[AnyVal]()
x._2.copyToArray(temp)
(x._1, Vectors.sparse(filtered_key_size, temp.map(_.asInstanceOf[Int]), Array.fill(filtered_key_size)(1) ))
})
我遇到一些奇怪的錯誤:
org.apache.spark.SparkException:由於階段失敗而導致作業中止:54.0階段中的任務3失敗了1次,最近一次失敗:54.0階段中的任務3.0丟失(TID 75,本地主機):java.lang.IllegalArgumentException:要求失敗
當我嘗試使用以下代碼調試該程序時:
val vectors = filtered_data_by_key.map( x => {
val temp = Array[AnyVal]()
val t = x._2.copyToArray(temp)
(x._1, temp)
})
我發現temp為空,所以問題出在copyToArray()
。
我不確定該如何解決。
我不完全明白這個問題。 為什么鑰匙很重要? 最大索引值是多少? 在您的代碼中,您確實想使用不同數量的鍵作為索引的最大值,但是我認為這是一個錯誤。
但我假設最大索引值為5。在這種情況下,我相信這就是您要尋找的內容:
val vectors = data_by_key.map({case(k,it)=>Vectors.sparse(5,it.map(x=>x-1).toArray,
Array.fill(it.size)(1))})
val rm = new RowMatrix(vectors)
我將索引號減少了一個,因為它們應該以0開頭。
錯誤“要求失敗”是由於索引和值向量的大小不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.