将 RDD 转换为 RowMatrix 以进行 PCA
Transform RDD into RowMatrix for PCA
我的原始数据是这样的:
RDD数据:
key -> index
1 -> 2
1 -> 3
1 -> 5
2 -> 1
2 -> 3
2 -> 4
如何将RDD转换为以下格式?
key -> 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: Job aborted due to stage failure: Task 3 in stage 54.0 failed 1 times, most recent failure: Lost task 3.0 in stage 54.0 (TID 75, localhost): java.lang.IllegalArgumentException: requirement failed
当我尝试使用以下代码调试此程序时:
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 开始。
错误 'requirement failed' 是由于您的索引和值向量的大小不同。
我的原始数据是这样的:
RDD数据:
key -> index
1 -> 2
1 -> 3
1 -> 5
2 -> 1
2 -> 3
2 -> 4
如何将RDD转换为以下格式?
key -> 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: Job aborted due to stage failure: Task 3 in stage 54.0 failed 1 times, most recent failure: Lost task 3.0 in stage 54.0 (TID 75, localhost): java.lang.IllegalArgumentException: requirement failed
当我尝试使用以下代码调试此程序时:
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 开始。
错误 'requirement failed' 是由于您的索引和值向量的大小不同。