使用递归案例类进行Spark

时间:2019-01-17 17:16:09

标签: scala apache-spark apache-spark-sql apache-spark-dataset

我有一个递归的数据结构。 Spark出现此错误:

Exception in thread "main" java.lang.UnsupportedOperationException: cannot have circular references in class, but got the circular reference of class BulletPoint

作为示例,我编写了以下代码:

case class BulletPoint(item: String, children: List[BulletPoint])

object TestApp extends App {
  val sparkSession = SparkSession
    .builder()
    .appName("spark app")
    .master(s"local")
    .getOrCreate()

  import sparkSession.implicits._

  sparkSession.createDataset(List(BulletPoint("1", Nil), BulletPoint("2", Nil)))
}

有人知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

该异常是相当明确的-默认情况下不支持这种情况。您必须记住,Datasets已编码为关系模式,因此必须预先声明所有必填字段并对其进行限制。这里没有递归结构的地方。

这里有一个小窗口-binary Encoders

import org.apache.spark.sql.{Encoder, Encoders}

sparkSession.createDataset(List(
  BulletPoint("1", Nil), BulletPoint("2", Nil)
))(Encoders.kryo[BulletPoint])

或等价物:

implicit val bulletPointEncoder = Encoders.kryo[BulletPoint]

sparkSession.createDataset(List(
  BulletPoint("1", Nil), BulletPoint("2", Nil)
))

但是,除非绝对必要,否则它实际上并不是您想要在代码中包含的内容。