代码之家  ›  专栏  ›  技术社区  ›  Nargis

过滤和排序顶点图形X scala

  •  0
  • Nargis  · 技术社区  · 6 年前

    我的图包含具有不同属性类的顶点。我想过滤具有特定属性的顶点,然后对它们进行排序。我的代码如下所示:

    class VertexProperty()
    case class Property1(val name: String, val servings: Int) extends VertexProperty
    case class Property2(val description: String) extends VertexProperty
    
    val vertexArray = Array(
    (1L, Property1("propertyName",8)),
    (2L, Property1("propertyName",4)),
    (3L, Property2("description"))
    )
    
    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)
    

    我只想使用property1获取顶点,此代码工作正常:

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

    结果是:

    (1L,属性1(“属性名”,8)),(2L,属性1(“属性名”,4))

    现在,问题是我想让这些顶点按“servings”排序,这是property1类的第二个参数。我可以按顶点ID对结果进行排序:

    vertices.collect().sortBy(_._1).foreach(println)
    

    但这不管用。

    vertices.collect().sortBy(_._2._2).foreach(println)
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Alper t. Turker    6 年前

    转换 VertexProperty trait (或使父类 Serializable )

    sealed trait VertexProperty
    case class Property1(name: String, servings: Int) extends VertexProperty
    case class Property2(description: String) extends VertexProperty
    

    确保类型匹配:

    val vertexArray: Array[(Long, VertexProperty)] = Array(
      (1L, Property1("propertyName",8)),
      (2L, Property1("propertyName",4)),
      (3L, Property2("description"))
    )
    

    收集而不是筛选:

    val vertices: RDD[(Long, Property1)] = graph.vertices.collect {
      case (id, p @ Property1(name, _)) if name != "" => (id, p)
    }
    

    结果 RDD RDD[(Long, Property1)] 你可以根据 Property1 领域。

    注释 :

    1. 如果没有额外的调整,它可能在repl中不起作用。见 Case class equality in Apache Spark 如有必要,请遵循说明。

    2. collect { } 的行为与 collect() . 第一个通过应用f返回一个包含所有匹配值的RDD,而最新的则收集一个包含此RDD中所有元素的数组并返回给驱动程序。

    3. 你不能 sortBy(_._2._2) ,因为 财产1 不是 Tuple2 没有 _._2 -它只有 name servings . 也没有必要 collect :

      vertices.sortBy(_._2.servings)