Caused by: java.io.NotSerializableException: org.apache.spark.SparkContext

当你执行各种转换(map,flatMap,filter等等)的时候,会有以下转换:

1、在driver节点上序列化,

2、上传到合适的集群中的节点,

3、在节点上执行反序列化,

4、最后在节点上执行。

当然你也可以在本地运行,除了没有网络传输,其他的过程都一样的,这样的好处就是方便调试在你部署之前。

在这个例子中,你在class Test1中定义了一个方法,并运用在了map中,Spark知道不能序列化这个方法,于是试图序列化整个类,因此才能使得这个方法能运行在其他JVM之上,正因为本例没有序列化,所以才出现异常。


要解决这个问题可以有以下两种方法:


1. 在val sc = spark.sparkContext 上面加  @transient
2. .map(这里面写成一个函数出来) -- 因为scala里函数就是对象

@transient
val sc = spark.sparkContext
val sqlContext = spark.sqlContext

val medlineRaw = loadMedline(sc, "file:/home/raini/音乐/medline_data_test") 
val mxml: RDD[Elem] = medlineRaw.map(XML.loadString) // 得到: Array[scala.xml.Elem] =
val medline: RDD[Seq[String]] = mxml.map(majorTopics).cache()

3. 类继承序列化类

object RunGraph extends Serializable {



上面是对类内的适用方法:


在spark-shell里不适用


反而是把map函数放在map里执行才可以


//val medline: RDD[Seq[String]] = mxml.map(majorTopics).cache()
val medline = mxml.map{elem: Elem =>
  val dn = elem \\ "DescriptorName"
  val mt = dn.filter(n => (n \ "@MajorTopicYN").text == "Y")
  mt.map(n => n.text)
}.cache()


你可能感兴趣的:(Trouble,Shooting)