我正在尝试使用spark cassandra连接器从Cassandra数据库中利用一些数据,但我正在犯这个错误:
org.apache.spark.SparkException: Task not serializable
.
.
Caused by: java.io.NotSerializableException: org.apache.spark.SparkConf
你可以在下面看到我的代码,我正在使用spark-shell进行实验
import com.datastax.spark.connector._, org.apache.spark.SparkContext,
org.apache.spark.SparkContext._, org.apache.spark.SparkConf
import collection.JavaConverters._
sc.stop
val conf = new SparkConf(true).set("spark.cassandra.connection.host", "xxx.xxx.xxx.xxx")
val sc = new SparkContext("local","test",conf)
val rdd = sc.cassandraTable("key", "table_name")
rdd.collect // ok
val rdd2 = rdd.where("aa > 10 and aa < 20")
rdd2.collect // ok
// method1 return an object without any link with SparkContext
val rdd3 = rdd2.map( x=> method1() )
rdd3.collect // ok
// Error rise to get rdd4
val rdd4 = rdd3.map(x=>method2(x,new Obj1(x.method3())))
// If i do that it works
rdd3.collect.map(x=>method2(x,new Obj1(x.method3())))
我读了一些用户在地图函数中调用包括SparkContext作为参数的方法的情况,但这不是我的情况。我调用方法的对象是对象,没有任何与SparkContext的链接。
我试图成功收集rdd rdd2 rdd3,但是当我应用地图来获取rdd4时,我会犯错误。
答案 0 :(得分:0)
我遇到了这个错误并通过删除行val sc = new SparkContext
来解决,因为我使用的是Apache Zeppelin,它默认提供了sc
。
尝试将sc.stop
放在代码的末尾。
答案 1 :(得分:0)
我终于解决了这个问题,实际上我有一个在本地声明的method2的参数。
val v1 = Set[Double].empty.asJava
val v2 = java.lang.Boolean.TRUE
我只是播放这些价值观,所有作品都像魅力一样。 感谢您的建议