2017-04-03 5 views
0

Spark 2.1.0 GraphXでScalaを使用しています。私が含まれている配列を渡すとき、私は単一の値のためのエッジテーブルをフィルタリングするために持っていた場合、-1895512637Spark GraphX - グラフのエッジをフィルタリングするにはどうすればいいですか?

val TEMP1Edge = graph.edges.filter { case Edge(src, dst, prop) => src == -1895512637} 

scala> TEMP1Edge.take(5) 
res52: Array[org.apache.spark.graphx.Edge[Int]] = Array(Edge(-1895512637,-2105158920,89), Edge(-1895512637,-2020727043,3), Edge(-1895512637,-1963423298,449), Edge(-1895512637,-1855207100,214), Edge(-1895512637,-1852287689,339)) 

scala> TEMP1Edge.count 
17/04/03 10:20:31 WARN Executor: 1 block locks were not released by TID = 1436:[rdd_36_2] 
res53: Long = 126 

のはsoruce IDのために言わせ

scala> TEMP1Vertex.take(5) 
res46: Array[org.apache.spark.graphx.VertexId] = Array(-1895512637, -1745667420, -1448961741, -1352361520, -1286348803) 

しかし:私は、以下に示すように、配列を持っていますユニークなソースIDのセットは、コードが正常に実行されますが、以下に示すように、任意の値を返しません:

scala> val TEMP1Edge = graph.edges.filter { case Edge(src, dst, prop) => src == TEMP1Vertex} 
TEMP1Edge: org.apache.spark.rdd.RDD[org.apache.spark.graphx.Edge[Int]] = MapPartitionsRDD[929] at filter at <console>:56 

scala> TEMP1Edge.take(5) 
17/04/03 10:29:07 WARN Executor: 1 block locks were not released by TID = 1471: 
[rdd_36_5] 
res60: Array[org.apache.spark.graphx.Edge[Int]] = Array() 

scala> TEMP1Edge.count 
17/04/03 10:29:10 WARN Executor: 1 block locks were not released by TID = 1477: 
[rdd_36_5] 
res61: Long = 0 
+0

私はgraphXについて何も知りませんが、 'src'と' TEMP1Vertex'の種類が異なっているので、あなたの述語は、おそらく常に、 'false'を返します。 –

+0

'src == Traversable(TEMP1Vertex)'と 'src == Iterable(TEMP1Vertex)'を試してみました。そして、あなたはおそらく 'Temp1Vertex.contains(src)実行は成功しましたが、どちらもうまくいっていません – Nagesh

+0

'=='は強く型付けされていませんが、主にjavaとの相互運用性のためにコンパイルされます。しかし、異なる型のオブジェクトを比較すると、常にfalseが返されます(特定の 'equals'メソッドが定義されていない限り) –

答えて

2

私はTEMP1VertexがタイプArray[VertexId]であると仮定し、私はYと思います我々のコードは次のようにする必要があります:

val TEMP1Edge = graph.edges.filter { 
    case Edge(src, _, _) => TEMP1Vertex.contains(src) 
} 
+0

' :57:error:値containsはorg.apacheのメンバーではありません.spark.rdd.RDD [org.apache.spark.graphx.VertexId] ' – Nagesh

+1

' TEMP1Vertex'が 'RDD [VertexId]'タイプである必要がありますか? 'Array [VertexId]'もうまくいきますか? –

+0

'TEMP1Vertex'は、質問に示されている構文に従っています。正しい出力が返ってくる限り、どのタイプにでも変更できますが、 'RDD [VertexId]'から 'Array [VertexId] 'にどのように変換できるのか分かりません。 – Nagesh