2015-01-14 45 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