我有一个返回数据框的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。如果不支持这一点,我该如何将多列返回到外部程序。
谢谢
bala
不支持返回数据框
正确 - 您无法从UDF返回数据框。UDFS应返回可转换为受支持的列类型的类型:
- primitives (int,string,boolean,...)
- 元组
- 列表,数组,地图
- 其他受支持类型的案例类
在您的情况下,您可以使用案例类:
case class Record(noprob: Double, yesprob: Double, pred: Double)
并让您的UDF(predict_churn
)返回Record
。然后,当应用于单个记录(如UDF所示)时,此案例类将转换为名为其成员的列(以及正确的类型),从而产生类似于您功能当前返回的数据框。