【问题标题】:Task not serializable when class is serializable类可序列化时任务不可序列化
【发布时间】:2020-07-10 07:37:35
【问题描述】:

我在 Scala 中有以下课程

case class A
  (a:Int,b:Int) extends Serializable

当我尝试使用 Spark 2.4 时。 (通过 Databricks)

val textFile = sc.textFile(...) 
val df = textFile.map(_=>new A(2,3)).toDF()

(编辑:当我调用 df.collect() 或注册为表时发生错误)

我收到org.apache.spark.SparkException: Task not serializable

我错过了什么?

我尝试添加编码器:

implicit def AEncoder: org.apache.spark.sql.Encoder[A] = 
  org.apache.spark.sql.Encoders.kryo[A]

import spark.implicits._
import org.apache.spark.sql.Encoders

编辑:我也试过:

val df = textFile.map(_=>new A(2,3)).collect()

但到目前为止还没有运气。

【问题讨论】:

  • 真正的集群版还是社区版?这到底有什么意义?
  • @thebluephantom 社区版。这只是一个示例,我有一个通过正则表达式等提取的复杂数据类型。否则我需要创建一个列数组(20+),手动映射列。我以为使用 Type 很简单?!
  • 我无法得到错误,只是尝试在 CE 上。我也不需要新的。重新启动集群并重试,我有时会遇到此错误,重新启动后它没有发生。任务不可序列化。你能确认一下吗?
  • 我在等5。
  • @thebluephantom 我仍然收到错误,但是当我调用收集或注册为表格时。

标签: scala apache-spark databricks


【解决方案1】:

有时这会在 DataBricks 上间歇性发生。最烦人的。

重启集群再试一次,我有时也出现这个错误,重启后就没有了。

【讨论】:

    【解决方案2】:

    您可以使用您拥有的案例类直接将文件解析为Dataset

    case class A(a:Int,b:Int) extends Serializable
    val testRDD = spark.sparkContext.textFile("file:///test_file.csv")
    val testDS = testRDD.map( line => line.split(",")).map(line_cols => A(line_cols(0).toInt, line_cols(1).toInt) ).toDS()
    
    #res23: org.apache.spark.sql.Dataset[A] = [a: int, b: int]
    

    【讨论】:

    • 这就是我的目标,但是当我调用 collect 或 register table 时,我得到 Task not serializable
    • 我无法重现该错误,但在 Databricks 集群上工作正常。
    猜你喜欢
    • 2015-06-17
    • 1970-01-01
    • 2018-04-06
    • 2021-03-16
    • 2018-09-19
    • 2015-05-31
    • 2015-09-27
    • 1970-01-01
    • 2015-08-10
    相关资源
    最近更新 更多