2016-12-16 5 views
1

GraphLoader edgeListFileでロードするグラフのエッジを表すsrcId - > dstId値を持つファイルがあります。ソースはユーザーと宛先アイテムを表しますいくつかの場合、srcIdとdstIdは等しいので、いくつかのアルゴリズムでは、各頂点のネイバーを収集したいときなどのエラーがあります。ユーザーとアイテムを分けて情報を失わないようにすることはできますかApache Spark Graphx:ソースとデスティネーションがVertexIdを共有していますが、別のものを返す

答えて

0

各GraphX頂点は一意の長い値で定義する必要があります。送信元IDと送信先IDが異なるものを表す場合は、それらが別個のものであることを確認するために、ある操作でそれらを変換する必要があります。たとえば、あなたがRDD[(Long, Long)]にあなたのデータを読んでいる、あなたができると仮定すると:

import org.apache.spark.rdd.RDD 
import org.apache.spark.graphx.{Edge, Graph} 

val userMaxID = rdd.map(_._1).distinct.max 
val edges: RDD[Edge[Int]] = rdd.map { 
    case (userID, itemID) => Edge(userID, itemID + userMaxID, 0) 
} 

val g = Graph.fromEdges(edges, 0) 

その後、あなたはすべてのアイテムIDが元のID +ユーザーの最大のIDになりますグラフを持つことになります(場合IDは0にすることができます。追加する必要があります1)。

これは単なる示唆に過ぎないことに注意してください。アイデアは、IDがユーザーと同じIDを持つことができないようにIDを変換する必要があるということです。また、与えられた頂点がユーザかアイテムかを知る方法を保つこともできます。私の提案ではIDが< = userMaxIDのすべての頂点がユーザーになりますが、IDが>userMaxIDのすべての頂点はアイテムになります。

+1

これも私が思いついたのですが、item idの値が負の値に変更されました。たとえば、前に1 - > 1だったのですが、今は1 - > -1です。Graphxは負の頂点IDを許可します。 – user3224454

+0

@ user3224454それは良い解決策です!私はGraphXが負のIDを許可していることを知らなかった、それは知っているのは良いことだ。 –

関連する問題