2017-03-28 6 views
1

から2D行列を作成しますムービーID)には1があります。は((ユーザーID、MOVIEID)1)I型の次のRDDを有するRDD

Nが個別ユーザーの数である場合はユーザーIDを0-Nにマップし、Misの場合はムービーIDを0-Mにマップする必要があると思います異なる映画の数

EDIT:あなたが述べたように例

 Movie ID-> 

Userid 1 2 3 4 5 6 7 

1  0 1 1 0 0 1 0 
2  0 1 0 1 0 0 0 
3  0 1 1 0 0 0 1 
4  1 1 0 0 1 0 0 
5  0 1 1 0 0 0 1 
6  1 1 1 1 1 0 0 
7  0 1 1 0 0 0 0 
8  0 1 1 1 0 0 1 
9  0 1 1 0 0 1 0 

The RDD will be of the sort 
(userID, movID,rating) 
101,1002,3.5 
101,1003,2.5 
101,1006,3 
102,1002,3.5 
102,1004,4.0 
103,1002,1.0 
103,1003,1.0 
103,1007,5.0 
…. 
+0

を?? – BDR

+0

それぞれのユーザーIDに1と0の値を持つ2次元マトリックスと考えられる出力、ムービーIDのペア –

+0

は私にフォーマットを与えることができます。 – BDR

答えて

0

HI Iは、以下の関数を用いて2次元マトリクスを生成することができました。それは形式

((userID, movID),rating) 
101,1002,3.5 
101,1003,2.5 
101,1006,3 
102,1002,3.5 
102,1004,4.0 
103,1002,1.0 
103,1003,1.0 
103,1007,5.0 

のRDDを取り込み、特性行列を返します。あなたが期待される出力形式を共有することができ

def generate_characteristic_matrix(data_wo_header:RDD[((Int, Int), Int)]):Array[Array[Int]]={ 
    val distinct_user_IDs=data_wo_header.sortByKey().map(x=>x._1._1).distinct().collect().sorted 
    val distinct_movie_IDs=data_wo_header.sortByKey().map(x=>x._1._2).distinct().collect().sorted 

    var movie_count=distinct_movie_IDs.size 
    var user_count=distinct_user_IDs.size 

    var a =0 
    var map_movie = new ArrayBuffer[(Int, Int)]() 
    var map_user = new ArrayBuffer[(Int, Int)]() 
    //map movie ID's from (0,movie_count) 
    for(a <- 0 to movie_count-1){ 
     map_movie+=((distinct_movie_IDs(a),a)) 
    } 
    //map user ID's from (0,user_count) 
    for(a <- 0 to user_count-1){ 
     map_user+=((distinct_user_IDs(a),a)) 
    } 
    //size of char matrix is user_countxmovie_count 
    var char_matrix = Array.ofDim[Int](user_count,movie_count) 
    data_wo_header.collect().foreach(x => { 
     var user =x._1._1 
     var movie=x._1._2 
     var movie_mappedid=map_movie.filter(x=>x._1==movie).map(x=>x._2).toArray 
     var user_mappedid=map_user.filter(x=>x._1==user).map(x=>x._2).toArray 
     char_matrix(user_mappedid(0))(movie_mappedid(0))=1 
    }) 
    return char_matrix 
    } 
0
val baseRDD = sc.parallelize(Seq((101, 1002, 3.5), (101, 1003, 2.5), (101, 1006, 3), (102, 1002, 3.5), (102, 1004, 4.0), (103, 1002, 1.0), (103, 1003, 1.0), (103, 1007, 5.0)))  
     baseRDD.map(x => (x._1, x._2)).groupByKey().foreach(println) 

(ユーザーID、movID、評価)形式

結果:

(101、(1002、1003、1006 CompactBuffer ))

(102、CompactBuffer(1002,1004))

(103、CompactBuffer(1002,1003、1007))

+0

しかし、0 1 0マトリックスをどのように生成/印刷するのですか? –

+0

あなたはまた、ユーザーから与えられた評価も欲しいと言っていますか? tis(101(1002,4.0)、(1003,3.5)、(1006,4.0))のような何か? – BDR

+0

私はその質問に編集を加えました。私は、編集で示された形式で行列を印刷したい。行列は要素0 1 1 0 0 1 0.を持つ。ユーザーID 101は行列の行1で表される。 Matrixの列1で表される映画ID1001。同様に、列2で表される映画ID 1002など、 –

関連する問題