2

Spark のレコメンデーション システムを使用しています。

モデルをトレーニングした後、推奨モデルを取得するために以下のコードを実行しました.recommendProductsForUsers(2)

[(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)))]

この場合RecRDD以下を参照してください。

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

この情報を次のようなデータフレームに入れるにはどうすればよいですか

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

お時間をありがとう

4

1 に答える 1

3

確認するために、次の pyspark コードを使用して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)))])

この RDD はキーと値のペアで構成され、各値は評価タプルを含むレコードで構成されます。レコードのみを保持するように RDD をマップし、結果を展開して、推奨ごとに個別のタプルを作成する必要があります。このflatMap(f)関数は、次のようにこれら 2 つのステップを要約します。

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

これにより、次の形式の RDD が生成されます。

[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)]

あとは、関数を使用してcreateDataFrameこれを DataFrame に変換するだけです。各 Rating タプルは DataFrame 行に変換され、項目にラベルが付けられるため、スキーマを指定する必要はありません。

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

これにより、次のように出力されます。

+-----+--------+--------------------+
| 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|
+-----+--------+--------------------+
于 2016-03-28T21:21:43.497 に答える