我在Spark上使用Graphx进行一些实验,目前的步骤是获取生成图的子图。我已经检查了原始图表是否已成功生成,不仅懒惰的谱系进展顺利,而且当我尝试graph.vertices.first()
时,结果正确显示。现在我的子图代码是:
val reg = "(\\d*)11".r
val graphUSA_subgraph = graphUSA.subgraph(
vpred = (id, user) =>{
(id.toString() match{
case reg(x) => true
case _ => false
})
}
)
graphUSA_subgraph.vertices.first()
我的意思是让子图只包含索引以“11”结尾的节点。我检查了Boolean
中的vpred = (id, user) => Boolean
块,逻辑是正确的。令我困惑的是当我在spark shell中运行代码时它引发了一个Error,并且log如下:
Exception in task * in stage *...
java.io.InvalidClassException:...
unable to create instance
at java.io.ObjectInputStream. ...
...
Caused by: org.apache.spark.SparkException: Only one SparkContext may be running in this JVM ... The currently running SparkContext was created at:
org.apache.spark.SparkContext.<init>(SparkContext.scala:123)
错误不是由Graph.subgraph()
本身引起的,因为当我运行更简单的版本时:
val graph_subgraph_1 = graph.subgraph{
vpred = (id, user) => id.toString.endsWith("00")
}
graph_subgraph_1.vertices.first()
一切都很顺利。
然后我尝试了另一个版本,它没有引用Graph类外的reg
:
val graphUSA_subgraph_0 = graphUSA.subgraph(
vpred = (id, user) =>{
id.toString().drop(id.toString().length() -2) match{
case "11" => true
case _ => false
}
}
)
graphUSA_subgraph_0.vertices.first()
一切都很顺利。
我想知道在管道中隐式生成新SparkContext
的步骤。似乎有可能引用一些val
(regs
)外部函数引起它。
我已经在这个街区挣扎了很长一段时间,如果有人能够对它有所了解,我将不胜感激。提前谢谢!