我有一部电影,有一个标题。这个标题中是电影的年份,如“电影(年)”。我想提取年份,为此我使用正则表达式。
case class MovieRaw(movieid:Long,genres:String,title:String)
case class Movie(movieid:Long,genres:Set[String],title:String,year:Int)
val regexYear = ".*\\((\\d*)\\)".r
moviesRaw.map{case MovieRaw(i,g,t) => Movie(i,g,t,t.trim() match { case regexYear(y) => Integer.parseInt(y)})}
执行最后一个命令时,出现以下错误:
java.io.NotSerializedException:org.apache.spark.SparkConf
使用以下 SparkContext 在 Spark/Scala REPL 中运行:
val conf = new SparkConf(true).set("spark.cassandra.connection.host", "localhost")
val sc = 新 SparkContext(conf)
最佳答案
正如 Dean 所解释的,问题的原因是 REPL 从添加到 REPL 的代码中创建了一个类,在这种情况下,同一上下文中的其他变量被闭包中的“拉”正则表达式声明。
鉴于您创建上下文的方式,避免序列化问题的一个简单方法是声明 SparkConf
和 SparkContext
transient :
@transient val conf = new SparkConf(true).set("spark.cassandra.connection.host", "localhost")
@transient val sc = new SparkContext(conf)
您甚至不需要在 REPL 中重新创建 Spark 上下文,其唯一目的就是连接到 Cassandra:
spark-shell --conf spark.cassandra.connection.host=localhost
关于regex - 任务不可序列化 - 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30032387/