sparksql-如何用map[string,any]作为自定义对象的字段来编写自定义编码器?

lsmepo6l  于 2021-06-02  发布在  Hadoop
关注(0)|答案(0)|浏览(341)

我正在尝试将csv作为自定义对象类型的Dataframe加载:

  1. case class Geom(attributes: Map[String, Any])

我试过这个:

  1. import session.implicits._
  2. implicit val mapEncoder = org.apache.spark.sql.Encoders.kryo[Map[String, Any]]
  3. implicit val geomEncoder = org.apache.spark.sql.Encoders.product[Geom]
  4. val sparkSQLGeometryRDD = session.read
  5. .option("delimiter", "\t")
  6. .option("inferSchema", "true")
  7. .option("header", "true")
  8. .csv("src\\main\\resources\\TexasPostCodes.txt")
  9. //.as[MyObjEncoded]//(encoder)
  10. .persist()
  11. val columns = sparkSQLGeometryRDD.schema.fieldNames
  12. //sparkSQLGeometryRDD.show()
  13. val mappedDF = sparkSQLGeometryRDD
  14. .map(x => x.getValuesMap[Any](columns.toList))
  15. .map(x => Geom(x))
  16. .show

但它抛出了一个例外:

  1. Exception in thread "main" java.lang.ClassNotFoundException: scala.Any
  2. at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
  3. at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
  4. at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)

有人能帮我找出,我的代码有什么问题吗?
在将case类和编码器从方法中移出之后,它工作得很好。

  1. object SpatialEncoders {
  2. implicit def MapEncoder: Encoder[Map[String, Any]]= Encoders.kryo[Map[String, Any]]
  3. implicit def GeomEncoder: Encoder[Geom] = Encoders.kryo[Geom]
  4. implicit def SparkSQLGeometryEncoder: Encoder[SparkSQLGeometry]= Encoders.kryo[SparkSQLGeometry]
  5. }

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题