Вчера (практически полный журнал) Я попытался найти элегантный способ представления модели с круговыми ссылками в Scala / Spark SQL 2.2.1
Допустим, этооригинальный подход к модели, который, конечно, не работает (имейте в виду, что у реальной модели есть десятки атрибутов):
case class Branch(id: Int, branches: List[Branch] = List.empty)
case class Tree(id: Int, branches: List[Branch])
val trees = Seq(Tree(1, List(Branch(2, List.empty), Branch(3, List(Branch(4, List.empty))))))
val ds = spark.createDataset(trees)
ds.show
И это ошибка, которую она выдает:
java.lang.UnsupportedOperationException: cannot have circular references in class, but got the circular reference of class Branch
Я знаю, что максимальный уровень иерархии , который у нас есть, равен 5 .Итак, как обходной путь, я, хотя в чем-то вроде:
case class BranchLevel5(id: Int)
case class BranchLevel4(id: Int, branches: List[BranchLevel5] = List.empty)
case class BranchLevel3(id: Int, branches: List[BranchLevel4] = List.empty)
case class BranchLevel2(id: Int, branches: List[BranchLevel3] = List.empty)
case class BranchLevel1(id: Int, branches: List[BranchLevel2] = List.empty)
case class Tree(id: Int, branches: List[BranchLevel1])
Конечно, это работает.Но это совсем не элегантно, и вы можете представить себе боль в реализации (удобочитаемость, связывание, обслуживание, удобство использования, дублирование кода и т. Д.)с круговыми ссылками в модели?