Ошибка стекового потока при вызове RDD #toDS с использованием объекта Java вместо класса Scala Case

#scala #apache-spark #apache-spark-dataset

#scala #apache-spark #apache-spark-dataset

Вопрос:

Я пытаюсь использовать существующий объект домена, определенный в сторонней библиотеке, а именно Patient объект HAPI-FHIR, для создания строго типизированного Spark DataSet[Patient] , подобного этому:

 scala> val patients = sc.loadFromMongoDB(ReadConfig(Map("uri" -> "mongodb://mongodb/fhir.patients")))
patients: com.mongodb.spark.rdd.MongoRDD[org.bson.Document] = MongoRDD[0] at RDD at MongoRDD.scala:47

scala> val patientsDataSet = patients.toDS[Patient](classOf[Patient])
  

Но, когда я выполняю вызов RDD # toDS выше, я получаю действительно длинный StackOverflowError .

Полная трассировка стека находится здесь: https://gist.github.com/vratnagiri-veriskhealth/6dcec9dbc6f74308019ab16c8d278a9b

Учитывая сложность объекта домена, на который я ссылался выше, я понимаю, что это может быть глупым поручением, но, учитывая, что я новичок в scala, я хочу убедиться, что я не пропустил никаких простых настроек, которые могли бы заставить это работать, прежде чем я откажусь от этого преследования.

Вот часть трассировки стека:

 java.lang.StackOverflowError
  at org.spark-project.guava.collect.ImmutableCollection.<init>(ImmutableCollection.java:48)
  at org.spark-project.guava.collect.ImmutableSet.<init>(ImmutableSet.java:396)
  at org.spark-project.guava.collect.ImmutableMapEntrySet.<init>(ImmutableMapEntrySet.java:35)
  at org.spark-project.guava.collect.RegularImmutableMap$EntrySet.<init>(RegularImmutableMap.java:174)
  at org.spark-project.guava.collect.RegularImmutableMap$EntrySet.<init>(RegularImmutableMap.java:174)
  at org.spark-project.guava.collect.RegularImmutableMap.createEntrySet(RegularImmutableMap.java:170)
  at org.spark-project.guava.collect.ImmutableMap.entrySet(ImmutableMap.java:385)
  at org.spark-project.guava.collect.ImmutableMap.entrySet(ImmutableMap.java:61)
  at org.spark-project.guava.reflect.TypeResolver.where(TypeResolver.java:97)
  at org.spark-project.guava.reflect.TypeResolver.accordingTo(TypeResolver.java:65)
  at org.spark-project.guava.reflect.TypeToken.resolveType(TypeToken.java:266)
  at org.spark-project.guava.reflect.TypeToken$1.getGenericReturnType(TypeToken.java:469)
  at org.spark-project.guava.reflect.Invokable.getReturnType(Invokable.java:109)
  at org.apache.spark.sql.catalyst.JavaTypeInference$$anonfun$2.apply(JavaTypeInference.scala:110)
  at org.apache.spark.sql.catalyst.JavaTypeInference$$anonfun$2.apply(JavaTypeInference.scala:109)
  at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
  at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
  at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
  at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108)
  at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
  at scala.collection.mutable.ArrayOps$ofRef.map(ArrayOps.scala:108)
  at org.apache.spark.sql.catalyst.JavaTypeInference$.org$apache$spark$sql$catalyst$JavaTypeInference$$inferDataType(JavaTypeInference.scala:109)
  at org.apache.spark.sql.catalyst.JavaTypeInference$.org$apache$spark$sql$catalyst$JavaTypeInference$$inferDataType(JavaTypeInference.scala:95)
  at org.apache.spark.sql.catalyst.JavaTypeInference$$anonfun$2.apply(JavaTypeInference.scala:111)
  at org.apache.spark.sql.catalyst.JavaTypeInference$$anonfun$2.apply(JavaTypeInference.scala:109)
  at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
  at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
  at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
  at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108)
  

Спасибо!

Ответ №1:

Вы пробовали печатать схему до и после преобразования вашего RDD в Dataset? Сравните схему и убедитесь, что схема согласована в отношении количества элементов и их соответствующих типов данных. Схема, напечатанная до преобразования и после преобразования, должна быть идентичной.

Комментарии:

1. Поле ответа на вопрос предназначено только для полных ответов на вопрос. Это больше похоже на комментарий, в котором запрашивается разъяснение вопроса. Либо отредактируйте это, чтобы превратить в полный ответ (предполагая, что автор имел в виду), либо удалите этот ответ, подождите, пока у вас не наберется достаточная репутация, и включите его в комментарий под вопросом.