Spark с использованием рекурсивного класса case - PullRequest
0 голосов
/ 17 января 2019

У меня есть рекурсивная структура данных. 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 голосов
/ 17 января 2019

Исключение является довольно явным - такой случай не поддерживается по умолчанию. Вы должны помнить, что Datasets кодируются в реляционную схему, поэтому все обязательные поля должны быть объявлены заранее и ограничены. Здесь нет места для рекурсивной структуры.

Здесь есть маленькое окно - двоичный файл 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)
))

но это действительно не то, что вы хотели бы иметь в своем коде, если в этом нет особой необходимости.

...