[英]Task not serializable - Regex
我有一部有标题的电影。 这个标题是电影的年份,例如“电影(年份)”。 我想提取年份,为此使用正则表达式。
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.NotSerializableException: org.apache.spark.SparkConf
使用以下SparkContext在Spark / Scala REPL中运行: val conf = new SparkConf(true).set("spark.cassandra.connection.host", "localhost") val sc = new SparkContext(conf)
正如Dean解释的那样,问题的原因是REPL从添加到REPL的代码中创建了一个类,在这种情况下,同一个上下文中的其他变量在正则表达式声明中被“拉”到闭包中。
根据您创建上下文的方式,一种避免序列化问题的简单方法是声明SparkConf
和SparkContext
瞬态:
@transient val conf = new SparkConf(true).set("spark.cassandra.connection.host", "localhost")
@transient val sc = new SparkContext(conf)
您甚至不需要为了连接到Cassandra的唯一目的而在REPL中重新创建spark上下文:
spark-shell --conf spark.cassandra.connection.host=localhost
您可能在较大的Scala类或对象(一种类型)中有此代码,对吗? 如果是这样,为了序列化regexYear
,整个封闭类型都会被序列化,但是您可能已经在该类型中定义了SparkConf
。
考虑到JVM和Java之上的语言的限制,这是一个非常普遍且令人困惑的问题,并且正在努力防止它。
解决方案(目前)是将regexYear
放在方法或另一个对象中:
object MyJob {
def main(...) = {
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)})}
...
}
}
要么
...
object small {
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)})}
}
希望这可以帮助。
尝试在命令行上为spark-shell传递cassandra选项,如下所示:
spark-shell [other options] --conf spark.cassandra.connection.host=localhost
这样一来,您不必重新创建SparkContext -您可以使用可通过spark-shell自动实例化的SparkContext(sc)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.