Graphx Scala: применение фильтра к вершине с наследованием свойств

У меня есть вершины с разными свойствами. Теперь я хочу отфильтровать те, у которых есть определенное значение свойства. Вот как выглядит мой код:

// Different property classes for different vertex
class VertexProperty()
case class Property1(val name: String, val servings: Int) extends VertexProperty
case class Property2(val description: String) extends VertexProperty
case class Property3(val name: String, val quantity: Double, val measurementUnit: String) extends VertexProperty

val vertexArray = Array(
    (1L, Property1("propertyName",8)),
    (2L, Property2("property description")),
    (3L, Property3("", 1,"lb."))
    )

 val edgeArray = Array(
     Edge(1L, 2L, "step1"),
     Edge(1L, 3L, "step2")
     )

 val vertexRDD: RDD[(Long, VertexProperty)] = sc.parallelize(vertexArray) 
 val edgeRDD: RDD[Edge[String]] = sc.parallelize(edgeArray)
 val graph: Graph[VertexProperty, String] = Graph(vertexRDD, edgeRDD)

Теперь я хочу отфильтровать вершины, у которых свойство Property2 и чье описание не пустое, пробовал такими способами:

  1. Это не дает ожидаемого результата

    graph.vertices.filter { case (id, (descrition)) => descrition !="" }.foreach{
      case (id, (descrition)) => println(s"$descrition")
    }
    
  2. Этот код не работает

    graph.vertices.filter { case (id, Property2(descrition)) => descrition !=""}.foreach{
      case (id, (descrition)) => println(s"$descrition")
    }
    

person Nargis    schedule 11.01.2018    source источник


Ответы (1)


Код, который вы пробовали, близок, но не совсем правильный. Вам нужны два случая в filter; один для Property2 и один для всех остальных случаев.

val vertices = graph.vertices.filter{
  case (id, vp: Property2) => vp.description != ""
  case _ => false
}

Это даст вам VertexRDD[VertexProperty] со всеми вершинами, которые удовлетворяют требованиям.

person Shaido    schedule 12.01.2018