spark:scala对象序列化导致再次调用构造函数

n3schb8v  于 2021-05-27  发布在  Spark
关注(0)|答案(0)|浏览(234)

如果我执行以下代码:

  1. object TestObject extends Serializable {
  2. private var x = 1;
  3. def inc(): Unit = { x = x + 1 }
  4. def get: Int = x
  5. }
  6. object ObjectSerMain {
  7. def main(args: Array[String]): Unit = {
  8. val spark = getSparkSession()
  9. import spark.implicits._
  10. val df = Seq(1 to 20 toList).toDF("num").repartition(5)
  11. val a = TestObject
  12. a.inc()
  13. val transformed = df.map(row => {
  14. val value: Int = row.getAs[Int]("num")
  15. value + a.get
  16. }).toDF("num")
  17. transformed.show(20)
  18. }
  19. }

尽管我在做 val a = TestObject 在司机身上,做什么 a.inc() 在对象上,最终转换的Dataframe为每个值加1,而不是2。
当我移除 extends SerializableTestObject 代码不起作用,这确保驱动端对象被传递给执行器。
因此,它在执行器上被重新初始化,即构造函数被重新调用。
有什么解决办法吗?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题