scala-用参数名替换具体值时的无限循环


0

我有两个对象(scala和using spark):

object Omain {
  def main(args: Array[String]) {
    odbscan
  }
}

2。对象odbscan

object odbscan {
  val conf = new SparkConf().setAppName("Clustering").setMaster("local")
  conf.set("spark.driver.maxResultSize", "3g")
  val sc = new SparkContext(conf)

val param_user_minimal_rating_count = 2

/Connexion/
val sqlcontext = new org.apache.spark.sql.SQLContext(sc)
val sql = "SELECT id, data FROM user_profile"
val options = connectMysql.getOptionsMap(sql)
val uSQL = sqlcontext.load("jdbc", options)

val users = uSQL.rdd.map { x =>
val v = x.toString().substring(1, x.toString().size - 1).split(",")
var ap: Map[Int, Double] = Map()
if (v.size > 1)
ap = v(1).split(";").map { y => (y.split(":")(0).toInt, y.split(":")(1).toDouble) }.toMap
(v(0).toInt, ap)
}.filter(.2.size >= param_user_minimal_rating_count)
println(users.collect().mkString("
"))
}

当我执行这段代码时,我得到一个无限循环,直到我改变:

过滤器(2.size>=param_user_minimal_rating_count)

过滤器(2.size>=1)

或任何其他数值,在这种情况下,代码 job,我的结果显示

2 答案

0

我认为这里发生的是spark序列化函数以通过连线发送它们。因为您的函数(传递给map的函数)调用对象odbscan的访问器param_user_minimal_rating_count,所以整个对象odbscan将需要序列化并随它一起发送。反序列化然后使用该反序列化对象将导致其主体中的代码再次执行,这将导致序列化-->发送-->反序列化-->执行-->序列化-->的无限循环…

这里最简单的事情可能是将val改为最终的val param_user_minimal_rating_count=2,这样编译器将内联该值。但请注意,这只是一个文本常量的解决方案。有关详细信息,请参见常量值定义和常量表达式。

另一个更好的解决方案是重构代码,以便在lambda表达式中不使用实例变量。引用在对象或类中定义的VAL将使整个对象序列化。因此,请尝试仅引用 local的VAL(方法)。最重要的是不要从构造函数/对象或类的主体中执行业务逻辑。


0

你的问题出在别的地方。

这两个代码片段之间的唯一区别是在 map外部定义val eps=5,它在代码的控制流中完全没有变化。

请张贴更多的上下文,以便我们可以帮助。


我来回答

写文章

提问题