我有一个返回数据帧的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|
+------------------+------------------+----+
然而,当我尝试使用命令
将其注册为UDF时hiveContext.udf.register("predict_churn", outerpredict _)
我收到类似
的错误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。如果不支持,请如何将多列返回到外部程序。
由于
巴拉
答案 0 :(得分:6)
不支持返回数据框
正确 - 您无法从UDF返回DataFrame。 UDF应返回可转换为支持的列类型的类型:
在您的情况下,您可以使用案例类:
case class Record(noprob: Double, yesprob: Double, pred: Double)
让您的UDF(predict_churn
)返回Record
。
然后,当应用于单个记录(如UDF)时,此案例类将转换为名为其成员的列(以及正确的类型),从而生成类似于函数当前返回的DataFrame。