2016-12-17 81 views
1

我是Scala的新手,我很难编写spark-sql应用程序来动态加载用户类并将rdds映射到它。使用Scala反射来创建其声明类的对象

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。
任何意见和建议,将不胜感激!谢谢!

+0

编译和/或运行此代码时会发生什么?你期望发生什么? –

+0

感谢您的注意,我添加了异常消息。我只是期望该对象是其声明的类,而不是任何或类[T]。 –

+1

我真的很好奇你想用这种方法解决什么样的问题。你能解释你的要求吗? – maasg

回答

1

我真的没有解决方案,但我可以告诉你一些你做错的事情。

您将对象包装在Tuple1中,然后尝试将元组转换为其他类型的元组,而不是对象本身。

cls.type不是Classcls表示的类型。它是变量cls的类型,在这种情况下恰好是java.lang.Class[_]

铸造主要是编译时的事情。所以你只能转换为编译时已知的类型。你说你正在动态加载类,所以我猜它们对编译器来说是不知道的。

+0

如果不支持运行时转换,恐怕首先我错了。谢谢你们一样。 –

+0

事情是,我认为运行时类型在这里并不重要。异常似乎表明Spark使用编译时类型来确定操作是否受支持。如果它是重要的运行时类型,则不需要投射。但我不是Spark专家。 –