使用Scala反射创建其声明类的对象



我是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[_]

铸造主要是编译时间的事情。因此,您只能投入到编译时已知的类型。您说您正在动态加载类,所以我想它们是编译器不知道的。

相关内容

  • 没有找到相关文章

最新更新