Apache Spark - 注册UDF-返回数据框架



我有一个返回数据框的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所示)时,此案例类将转换为名为其成员的列(以及正确的类型),从而产生类似于您功能当前返回的数据框。

最新更新