在类外引用val时是否隐式创建了SparkContext?

时间:2016-05-21 11:42:58

标签: scala shell apache-spark spark-graphx

我在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的步骤。似乎有可能引用一些valregs)外部函数引起它。

我已经在这个街区挣扎了很长一段时间,如果有人能够对它有所了解,我将不胜感激。提前谢谢!

0 个答案:

没有答案