收集

时间:2016-10-20 14:13:33

标签: java scala apache-spark

使用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工作正常,即保留其字段的值。

那么为什么图形对象没有被正确收集?

1 个答案:

答案 0 :(得分:2)

鉴于textData是RDD,不支持使用关闭SparkContext的map函数。

SparkContext是一个专门存在于驱动程序中的对象,它在执行程序中为“null”。 (令人惊讶的是,它没有给出SerializationException

可以在该操作的结果类型中发现相同的问题: JavaRDD<Graph<String, Object>>嵌套的RDD在概念上是未定义的。

一种可能的解决方案是在创建顶点和边缘RDD方面重新考虑该过程,并使用Graph构造函数来构建目标图。