2016-12-17 82 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專家。 –