代码之家  ›  专栏  ›  技术社区  ›  Haris Irshad

如何从对象元组数组中访问对象的成员

  •  1
  • Haris Irshad  · 技术社区  · 7 年前

    对象类为

    class VertexAttributes(val m: Boolean, n: Any){
    
            val rootParentCustNumber: String = if(n == null) "Was Null" else n.toString
            val firstMsgFlg = m
    
    }
    

    我有此对象类型的RDD:

    scala> myGraph.vertices
    res92: org.apache.spark.graphx.VertexRDD[VertexAttributes] = VertexRDDImpl[2280] at RDD at VertexRDD.scala:57
    

    在RDD上进行过滤,我得到以下结果:

    scala> res92.filter{case(k,m) => k == 964088677}.collect
    res94: Array[(org.apache.spark.graphx.VertexId, VertexAttributes)] = Array((964088677,VertexAttributes@2612b83f))
    

    如何访问 VertexAttributes@2612b83f.rootParentCustNumber 在里面 Array((964088677,VertexAttributes@2612b83f))

    我试过了 res92.filter{case(k,m) => k == 964088677}.map{case Array(k,m)=> m.rootParentCustNumber}

    但我得到以下错误:

    <console>:243: error: pattern type is incompatible with expected type;
     found   : Array[T]
     required: (org.apache.spark.graphx.VertexId, VertexAttributes)
        (which expands to)  (Long, VertexAttributes)
           res92.filter{case(k,m) => k == 964088677}.map{case Array(k,m)=> m.rootParentCustNumber}
                                                                   ^
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Xavier Guihot    7 年前

    过滤阶段不会更改RDD的类型(即 RDD[(Long, VertexAttributes)] )。

    因此,您可以使用映射阶段对过滤器阶段返回的RDD进行管道处理,并以与过滤阶段相同的方式处理每条记录:

    res92
      .filter{ case (k, m) => k == 964088677 }
      .map{ case (k, m) => m.rootParentCustNumber }
    

    我认为您被collect阶段误导了,该阶段将RDD转换为数组。