繁体   English   中英

任务不可序列化-正则表达式

[英]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的代码中创建了一个类,在这种情况下,同一个上下文中的其他变量在正则表达式声明中被“拉”到闭包中。

根据您创建上下文的方式,一种避免序列化问题的简单方法是声明SparkConfSparkContext瞬态:

@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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM