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()


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值