2016-12-17 3 views
1

私はScalaには新しく、spark-SQLアプリケーションを作成して動的にユーザクラスをロードし、それにrddをマップするのは難しいです。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 [_]、として、その宣言されたクラスオブジェクトに変換されます。実行時に次の例外がスローされます。012Wを使用していますが、Scala 2.10とspark 1.6.1を使用しています。
ご意見やご感想をお寄せください。ありがとう!

+0

このコードをコンパイルまたは実行するとどうなりますか?そして、あなたは何が起こると思いますか? –

+0

通知ありがとう、私は例外メッセージを追加しました。私は、オブジェクトが宣言されたクラスであることを期待しています。AnyまたはClass [T]ではありません。 –

+1

私はこのアプローチを使ってどのような問題を解決しようとしているのでしょうか?あなたの要件を説明できますか? – maasg

答えて

1

私は本当に解決策がありませんが、あなたが間違っていることを伝えることができます。

Tuple1にオブジェクトをラップし、タプルをオブジェクト自体ではなく別の型にキャストしようとします。

cls.typeは、Classclsを表すタイプではありません。これは変数clsのタイプで、この場合はjava.lang.Class[_]になります。

主にコンパイル時のものです。したがって、コンパイル時に知られている型にのみキャストすることができます。クラスを動的にロードしていると言うので、コンパイラには知られていないと思います。

+0

実行時キャストがサポートされていない場合、私は最初に間違っていたのではないかと心配しています。すべて同じようにありがとう。 –

+0

問題は、ランタイムの種類はここでは問題ではないと思います。この例外は、Sparkがコンパイル時の型を使用して、操作がサポートされているかどうかを判断しているようです。重要なランタイムタイプの場合は、キャストする必要はありません。しかし、私はスパークの専門家ではありません。 –

関連する問題