Я пытаюсь создать набор данных с некоторыми геоданными, используя искру и esri. Если Foo
имеет только поле Point
, оно будет работать, но если я добавлю другие поля за пределами Point
, я получаю ArrayIndexOutOfBoundsException.Spark kryo encoder ArrayIndexOutOfBoundsException
import com.esri.core.geometry.Point
import org.apache.spark.sql.{Encoder, Encoders, SQLContext}
import org.apache.spark.{SparkConf, SparkContext}
object Main {
case class Foo(position: Point, name: String)
object MyEncoders {
implicit def PointEncoder: Encoder[Point] = Encoders.kryo[Point]
implicit def FooEncoder: Encoder[Foo] = Encoders.kryo[Foo]
}
def main(args: Array[String]): Unit = {
val sc = new SparkContext(new SparkConf().setAppName("app").setMaster("local"))
val sqlContext = new SQLContext(sc)
import MyEncoders.{FooEncoder, PointEncoder}
import sqlContext.implicits._
Seq(new Foo(new Point(0, 0), "bar")).toDS.show
}
}
Исключение в потоке "основного" java.lang.ArrayIndexOutOfBoundsException: 1 в org.apache.spark.sql.execution.Queryable $$ anonfun $ FormatString $ 1 $$ anonfun $ применять $ 2.Apply (Queryable.scala: 71) в org.apache.spark.sql.execution.Queryable $$ anonfun $ FormatString $ 1 $$ anonfun $ применять $ 2.Apply (Queryable.scala: 70) на scala.collection.TraversableLike $ WithFilter $$ anonfun $ foreach $ 1.apply (TraversableLike.scala: 772) at scala.collection.mutable.ResizableArray $ class.foreach (ResizableArray.scal а: 59) в scala.collection.mutable.ArrayBuffer.foreach (ArrayBuffer.scala: 47) на scala.collection.TraversableLike $ WithFilter.foreach (TraversableLike.scala: 771) в org.apache.spark. sql.execution.Queryable $$ anonfun $ formatString $ 1.apply (Queryable.scala: 70) at org.apache.spark.sql.execution.Queryable $$ anonfun $ formatString $ 1.apply (Queryable.scala: 69) at scala.collection.mutable.ArraySeq.foreach (ArraySeq.scala: 73) в org.apache.spark.sql.execution.Queryable $ class.formatString (Queryable.scala: 69) at org.apache.spark.sql .Dataset.formatString (Dataset.scala: 65) в org.apache.spark.sql.Dataset.showString (Dataset.scala: 263) в org.apache.spark.sql.Dataset.show (Dataset.scala: 230) в org.apache.spark.sql.Dataset.show (Dataset.scala: 193) по адресу org.apache.spark.sql.Dataset .show (Dataset.scala: 201) в Main $ .main (Main.scala: 24) в Main.main (Main.scala)
Согласно [это] (http://stackoverflow.com/a/32454596/1805756), я думаю, было бы лучше не идти после пользовательского 'StructType'. Я буду придерживаться 'RDD'. – Mehraban
Это не должно быть 'StructType', это должно быть' BinaryType'. – Mehraban
Это зависит от вашей потребности, если вы хотите вложенную схему или нет, и как класс Point является сложным. –