У меня есть статья классApache Spark: Удерживать пользовательский класс в GraphX: не Serializable?
case class Article(articleName:String,
id:Option[Long],
authors: Iterator[Author],
keywords: Iterator[String])
(Автор является классом, который имеет 4 варианта строк)
, и я хочу, чтобы создать график из него. Я создал RDD вершин и ребер RDD
val vertices: RDD[(VertexId, Article)] = articles.map(article => (article.id.get , article))
, когда я создаю мой график:
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)
Я я не понимаю, почему я не могу делать то, что делаю?
Если я использую список, кажется, что в моем коде я теряю все хорошие возможности, которые я использую для построения своего графика, например, карты, фильтра и т. Д. Я рассмотрю обходные пути ... – Stephane
Вы можете построить «Итератор», как вы сейчас это делаете, и просто выполните один «toList» в конце. (Тем не менее, я не совсем уверен, какова ваша жалоба, потому что 'List' поддерживает' map', 'filter' и т. Д.). Вам нужно фиксированное значение для отправки по кластеру, а не к ленивому вычисляемому по запросу «Итератору» по причинам, которые, мы надеемся, очевидны. (Если «авторы» и «ключевые слова» являются очень большими наборами, вы можете превратить их в «RDD's», а затем «zip» или «product» или «join» с другими RDD), а не пытаться включить их в класс случая. – lmm