2016-03-28 18 views
2

Spark'un öneri sistemini kullanıyorum.PySpark - ALS çıkışında DataFrame için RDD

trenin bir modeli sonra, (2) Bu durumda Rec yılında

[(10000, (Rating(user=10000, product=14780773, rating=7.35695469892999e-05), 
      Rating(user=10000, product=17229476, rating=5.648606256948921e-05))), 
(0, (Rating(user=0, product=16750010, rating=0.04405213492474741), 
     Rating(user=0, product=17416511, rating=0.019491942665715176))), 
(20000, (Rating(user=20000, product=17433348, rating=0.017938298063142653), 
      Rating(user=20000, product=17333969, rating=0.01505112418739887)))] 

bir RDD aşağıya bakınız olan öneri model.recommendProductsForUsers elde etmek için aşağıdaki kodu yaptılar. Ben

+1

gerekli fonksiyon [PySpark dokümanlar kaplı] olduğu (https://spark.apache.org/docs/1.5.2/api/python /pyspark.sql.html). 'CreateDataFrame''e bakın. –

cevap

3

doğrulamak için zaman sizin için

User | Product | Rating 
1000 | 14780773 | 7.3e-05 
1000 | 17229675 | 5.6e-05 
(...)  (...)  (...) 
2000 | 17333969 | 0.015  

teşekkür gibi bir veri çerçevesi içinde bu bilgileri koymak Nasıl

>>> type(Rec) 
<class 'pyspark.rdd.RDD'> 

, ben yeniden üretmek aşağıdaki pyspark kodu kullanılan senin RDD:

from pyspark.mllib.recommendation import Rating 

Rec = sc.parallelize([(10000, (Rating(user=10000, product=14780773, rating=7.35695469892999e-05), 
           Rating(user=10000, product=17229476, rating=5.648606256948921e-05))), 
         (0, (Rating(user=0, product=16750010, rating=0.04405213492474741), 
          Rating(user=0, product=17416511, rating=0.019491942665715176))), 
         (20000, (Rating(user=20000, product=17433348, rating=0.017938298063142653), 
           Rating(user=20000, product=17333969, rating=0.01505112418739887)))]) 

Bu RDD, anahtar değer çiftlerinden oluşur. ith Değerlendirme tuples. Sadece kayıtları tutmak için RDD'yi eşleştirmeniz ve ardından her bir öneri için ayrı bir tuple sahip olması için sonuçları patlatmanız gerekir. flatMap(f) fonksiyon şöyle aşağıdaki iki adımı yoğunlaşacaktır:

[Rating(user=10000, product=14780773, rating=7.35695469892999e-05), 
Rating(user=10000, product=17229476, rating=5.648606256948921e-05), 
Rating(user=0, product=16750010, rating=0.04405213492474741), 
Rating(user=0, product=17416511, rating=0.019491942665715176), 
Rating(user=20000, product=17433348, rating=0.017938298063142653), 
Rating(user=20000, product=17333969, rating=0.01505112418739887)] 

Şimdi bütün gereken bir DataFrame çevirmeye createDataFrame işlevini kullanmaktır: şeklinde bir RDD sonuçlanır

flatRec = Rec.flatMap(lambda p: p[1]) 

. Her bir Değerlendirme bölümü bir DataFrame Row'a dönüştürülür ve öğeler etiketlendiğinden, bir şema belirtmenize gerek yoktur.

recDF = sqlContext.createDataFrame(flatRec).show() 

çıktısı verir aşağıdaki gibidir:

+-----+--------+--------------------+ 
| user| product|    rating| 
+-----+--------+--------------------+ 
|10000|14780773| 7.35695469892999E-5| 
|10000|17229476|5.648606256948921E-5| 
| 0|16750010| 0.04405213492474741| 
| 0|17416511|0.019491942665715176| 
|20000|17433348|0.017938298063142653| 
|20000|17333969| 0.01505112418739887| 
+-----+--------+--------------------+ 
+1

Andrea, mükemmel :) açıklamanız için çok teşekkürler. – Kardu

İlgili konular