我是Scala的新手,我很难编写Spark-SQL应用程序,以动态加载用户类并将RDD映射到其中。
rdd.map(line => {
val cls = Class.forName("UserClass")
val constructor = cls.getConstructor(classOf[String], classOf[String])
Tuple1(constructor.newInstence(line._1, line._2)).asInstanceOf[cls.type]
}).toDF()
问题是将对象转换为已声明的类,因为cls.type返回java.lang.class [_],这是无法预期的。在运行时,以下例外将被抛出:
java.lang.UnsupportedOperationException: Schema for type java.lang.class[_] is not supported
顺便说一句,我使用的是Scala 2.10和Spark 1.6.1。
任何建议和评论将不胜感激!谢谢!
我真的没有解决方案,但是我可以告诉你一些你做错的事情。
您将对象包裹在Tuple1
中,然后尝试将元组铸成其他类型,而不是对象本身。
cls.type
不是Class
cls
代表的类型。这是变量cls
的类型,在这种情况下,它恰好是java.lang.Class[_]
。
铸造主要是编译时间的事情。因此,您只能投入到编译时已知的类型。您说您正在动态加载类,所以我想它们是编译器不知道的。