2015-01-14 42 views
0

我有一篇文章類Apache Spark:保留GraphX中的自定義類:不可序列化?

case class Article(articleName:String, 
        id:Option[Long], 
        authors: Iterator[Author], 
        keywords: Iterator[String]) 

(作者是擁有4個選項字符串類)

,我想創建一個圖形出來。我創建了頂點的RDD和邊緣

val vertices: RDD[(VertexId, Article)] = articles.map(article => (article.id.get , article)) 

的RDD當我創建我的圖表:

val graph = Graph(vertices, edges) 

我得到以下錯誤(縮短):

java.io.NotSerializableException: scala.collection.LinearSeqLike$$anon$1 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) 

我不知道我明白爲什麼我不能做我正在做的事情?

回答

2

由於其中的LinearSeqLike不可序列化,因此您的班級不可序列化。在火花集羣節點上運行的任務必須被序列化才能到達那裏。我建議使用List或其他一些具體的,可序列化的序列類型,而不是Iterator

+0

如果我使用一個列表,似乎在我的代碼,我失去了所有的美好能力我用它來構建我的圖形,如地圖,過濾器等,我會考慮的解決方法... – Stephane

+1

您可以構建就像你現在所做的那樣''Iterator',並且最後只做一個'toList'。 (也就是說,我不太清楚你的投訴是什麼,因爲'List'支持'map','filter'等等)。你需要一個固定的值來發送整個集羣,而不是一些懶惰的按需計算的'Iterator',因爲有希望的原因很明顯。 (如果'authors'和'keywords'是非常大的集合,你可以把它們變成'RDD's然後'zip'或'product'或'join'與你的其他RDDs),而不是試圖將它們包含進去一個案例類。 – lmm