我有一个递归的数据结构。 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)))
}
有人知道如何解决这个问题吗?
答案 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)
))
但是,除非绝对必要,否则它实际上并不是您想要在代码中包含的内容。