首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >火花UDF作为函数参数,UDF不在函数范围内。

火花UDF作为函数参数,UDF不在函数范围内。
EN

Stack Overflow用户
提问于 2017-02-08 21:03:13
回答 1查看 1K关注 0票数 0

我想将几个UDF作为函数参数与数据帧一起传递。

这样做的一种方法可能是在函数中创建UDF,但这将创建和销毁UDF的几个实例,而不重用它--这可能不是解决此问题的最佳方法。

这是一个样本代码-

代码语言:javascript
复制
val lkpUDF = udf{(i: Int) => if (i > 0) 1 else 0}

val df =   inputDF1
    .withColumn("new_col", lkpUDF(col("c1")))
val df2 =   inputDF2.
  .withColumn("new_col", lkpUDF(col("c1")))

我不想做上面的事,我想做这样的事情-

代码语言:javascript
复制
val lkpUDF = udf{(i: Int) => if (i > 0) 1 else 0}

def appendCols(df: DataFrame, lkpUDF: ?): DataFrame = {

    df
      .withColumn("new_col", lkpUDF(col("c1")))

  }
val df = appendCols(inputDF, lkpUDF)

上面的UDF非常简单,但在我的示例中,它可以返回原始类型或用户定义的案例类类型。任何想法或建议都将不胜感激。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-08 22:10:19

您具有适当签名的功能需要如下:

代码语言:javascript
复制
import org.apache.spark.sql.UserDefinedFunction

def appendCols(df: DataFrame, func: UserDefinedFunction): DataFrame = {
    df.withColumn("new_col", func(col("col1")))
}

scala在返回初始化值的类型方面非常有用。

代码语言:javascript
复制
scala> val lkpUDF = udf{(i: Int) => if (i > 0) 1 else 0}
lkpUDF: org.apache.spark.sql.UserDefinedFunction = UserDefinedFunction(<function1>,IntegerType,List(IntegerType))

此外,如果传递给udf包装器的函数的签名包含一个Any返回类型(如果该函数可以返回原语或用户定义的case类,情况就是这样),则UDF将无法编译,异常情况如下:

代码语言:javascript
复制
java.lang.UnsupportedOperationException: Schema for type Any is not supported
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42123552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档