Apache Spark - 注册UDF - 返回数据帧

时间:2016-12-20 10:24:47

标签: scala apache-spark user-defined-functions

我有一个返回数据帧的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。如果不支持,请如何将多列返回到外部程序。

由于

巴拉

1 个答案:

答案 0 :(得分:6)

  

不支持返回数据框

正确 - 您无法从UDF返回DataFrame。 UDF应返回可转换为支持的列类型的类型:

  • Primitives (Int,String,Boolean,...)
  • 其他支持类型的元组
  • 其他受支持类型的列表,数组,地图
  • 其他受支持类型的案例类

在您的情况下,您可以使用案例类:

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

让您的UDF(predict_churn)返回Record。 然后,当应用于单个记录(如UDF)时,此案例类将转换为名为其成员的列(以及正确的类型),从而生成类似于函数当前返回的DataFrame。