一張圖里里的頂點可能表示多種不同的業務物件,所以每種物件都可能具有不同的屬性,要放在一張圖里,也就是放在一個頂點集RDD里,用多型就能解決了,RDD[T]或者RDD[(S,T)]這種模式,S和T用基類宣告,存盤不同的子類,子類各有各的屬性就可以了。
但是如果要讓邊也能不同的屬性,就不容易了。因為(S,T)這種元組可以多型,用(Long, BaseClass)就能代表(Long,SubClass),但是Edge[BaseClass]和Edge[SubClass]就不相通了。。。所以下面這段代碼最后一行就會編譯出錯,提示RDD[]里的元素型別不相符。
大家遇到類似的需求都是怎么解決的呢?
case class VertexAttr(xxxx) extends Serializable {
}
class VA(xxxxx) extends EdgeAttr(xxxxx) {
}
class VB(xxxxx) extends EdgeAttr(xxxxx) {
}
case class EdgeAttr(xxxxx) extends Serializable {
}
class EA(xxxxx) extends EdgeAttr(xxxx) {
}
class EB(xxxxx) extends EdgeAttr(xxxx) {
}
val vertexArray = Array(
(1L, new VA("xxxx")),
(2L, new VA("xxxx")),
(3L, new VB("xxxx"))
)
val edgeArray = Array(
Edge(1L, 2L, new EA("xxxx")),
Edge(1L, 3L, new EB("xxxx")),
Edge(2L, 3L, new EB("xxxx"))
)
//構造vertexRDD和edgeRDD
val vertexRDD: RDD[(Long, VertexAttr)] = sc.parallelize(vertexArray)
val edgeRDD: RDD[Edge[EdgeAttr]] = sc.parallelize(edgeArray)
uj5u.com熱心網友回復:
你好,請問這個問題您解決了嗎?還有一個問題,如果節點這個創建,那對節點進行過濾時應該如何匹配呢轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/23906.html
標籤:Spark
