使用Java + Scala和Apache Spark。
我在javaRDDs(textdata
变量)中有一些String数据,我使用帮助类转换为scala图:
SparkConf = new SparkConf(true); // also set parameters, etc
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<Graph<String, Object>> graphs = textdata.map(new GraphConverterClass(JavaSparkContext.toSparkContext(sc)));
List<Graph<String,Object>> graphsList = graphs.collect();
转换器类实现了Function接口,因此它有一个调用:
public Graph<String, Object> call(String data)
{
Graph<String,object> mygraph = someFunc(data,sc);
return mygraph;
}
当我运行它时,在转换器类中我可以看到mygraph
结果,并且没关系。
在我在驱动程序中收集的列表中,尽管图形的数量是正确的,但每个图形的顶点和边缘字段都是空的。
在上面的场景中使用另一个虚拟类而不是Graph工作正常,即保留其字段的值。
那么为什么图形对象没有被正确收集?
答案 0 :(得分:2)
鉴于textData
是RDD,不支持使用关闭SparkContext的map
函数。
SparkContext是一个专门存在于驱动程序中的对象,它在执行程序中为“null”。 (令人惊讶的是,它没有给出SerializationException
)
可以在该操作的结果类型中发现相同的问题:
JavaRDD<Graph<String, Object>>
嵌套的RDD在概念上是未定义的。
一种可能的解决方案是在创建顶点和边缘RDD方面重新考虑该过程,并使用Graph
构造函数来构建目标图。