将RDD转换为用于PCA的RowMatrix

时间:2015-01-14 18:41:18

标签: scala apache-spark

我的原始数据如下:

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,localhost):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()

我不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

我完全不理解这个问题。为什么你的钥匙很重要?什么是最大指数值?在您的代码中,您使用不同数量的键作为索引的最大值,但我认为这是一个错误。

但我会假设最大指数值为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开始。

错误'要求失败'是由于您的索引和值向量不具有相同的大小。