2016-12-20 16 views
-1

私はデータフレームを返すUDFを持っています。私は、コマンドApache Spark - UDFを登録する - データフレームを返す

hiveContext.udf.register("predict_churn", outerpredict _) 

を使用してUDFとしてこれを登録しようとすると、

scala> predict_churn(Vectors.dense(2.0,1.0,0.0,3.0,4.0,4.0,0.0,4.0,5.0,2.0)) 
res3: org.apache.spark.sql.DataFrame = [noprob: string, yesprob: string, pred: string] 

scala> predict_churn(Vectors.dense(2.0,1.0,0.0,3.0,4.0,4.0,0.0,4.0,5.0,2.0)).show 
+------------------+------------------+----+ 
|   noprob|   yesprob|pred| 
+------------------+------------------+----+ 
|0.3619977592578127|0.6380022407421874| 1.0| 
+------------------+------------------+----+ 

以下のようなものがしかし、私は

java.lang.UnsupportedOperationException: Schema for type org.apache.spark.sql.DataFrame is not supported 
      at  org.apache.spark.sql.catalyst.ScalaReflection$class.schemaFor(ScalaReflection.scala:715) 

がサポートされていないデータフレームを返しているようなエラーが発生します。私はSpark 1.6.1とScala 2.10を使用しています。これがサポートされていない場合、どうすれば複数の列を外部プログラムに返すことができますか。

おかげ

バラ

答えて

4

正しいをサポートしていないデータフレームを返す - あなたはUDFからのデータフレームを返すことはできません。サポートされている他のタイプの

  • プリミティブ(INT、文字列、論理値、...)
  • タプル
  • リスト、配列:UDFはサポートされている列の型に変換可能です型を返す必要がありますサポートされている他のタイプの、地図
  • ケースクラスサポートされている他のタイプの
あなたのケースでは

、あなたはケースクラスを使用することができます

case class Record(noprob: Double, yesprob: Double, pred: Double) 

をそして、あなたのUDF(predict_churn)リターンRecordを持っています。 次に、単一のレコード(UDFのように)に適用すると、このケースクラスはメンバーとして指定された列に変換され、現在の関数で返されるDataFrameに似たDataFrameが生成されます。

+0

ご返信ありがとうございます。 あなたから提案された解決策を試しました。これは私がやったことある 'ケースクラス度Prob次のように私の場合、クラスがある(noprob:文字列、yesprob:文字列、predは:文字列)'関数で 'ヴァルOP = result.mapた(p =>をPROB(P(0).toString、P(1).toString、P(2).toString)) OP //出力としてオペアンプを返す 私は非常に類似したエラーを取得したとしても、この後 ' **スケーラ> hiveContext.udf.register( "predict_churn"、outerpredict _) java.lang.UnsupportedOperationException:タイプorg.apache.spark.rdd.RDDのスキーマ[Prob]はサポートされていません ** 何が間違っていますか。 –

+0

変更されたUDFが_RDD_を返していますか?それは私が意味するものではない、それはちょうど_Record_ –

+0

を返す必要があります申し訳ありませんが、私は正しい構文が得られていません。どのように私は、変換することができます 'スカーラ>結果 res13:org.apache.spark.sql.DataFrame =タイプ 'ケースクラスのケースクラスへの[noprob:文字列、yesprob:文字列、predを文字列] ' –

関連する問題