Scala Spark UDF作为函数参数,UDF不在函数范围内
我有一些UDF,我想作为函数参数和数据帧一起传递 实现这一点的一种方法可能是在函数中创建UDF,但这将创建和销毁多个UDF实例,而不重用它,这可能不是解决此问题的最佳方法 下面是一段示例代码-Scala Spark UDF作为函数参数,UDF不在函数范围内,scala,apache-spark,apache-spark-sql,spark-dataframe,udf,Scala,Apache Spark,Apache Spark Sql,Spark Dataframe,Udf,我有一些UDF,我想作为函数参数和数据帧一起传递 实现这一点的一种方法可能是在函数中创建UDF,但这将创建和销毁多个UDF实例,而不重用它,这可能不是解决此问题的最佳方法 下面是一段示例代码- val lkpUDF = udf{(i: Int) => if (i > 0) 1 else 0} val df = inputDF1 .withColumn("new_col", lkpUDF(col("c1"))) val df2 = inputDF2. .withC
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")))
理想情况下,我不想做上述事情,而是想做这样的事情-
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非常简单,但在我的例子中,它可以返回一个基元类型或用户定义的case类类型。如有任何想法/建议,将不胜感激。谢谢。具有适当签名的功能需要如下:
import org.apache.spark.sql.UserDefinedFunction
def appendCols(df: DataFrame, func: UserDefinedFunction): DataFrame = {
df.withColumn("new_col", func(col("col1")))
}
scala REPL在返回初始化值的类型方面非常有用
scala> val lkpUDF = udf{(i: Int) => if (i > 0) 1 else 0}
lkpUDF: org.apache.spark.sql.UserDefinedFunction = UserDefinedFunction(<function1>,IntegerType,List(IntegerType))
具有适当签名的功能需要如下:
import org.apache.spark.sql.UserDefinedFunction
def appendCols(df: DataFrame, func: UserDefinedFunction): DataFrame = {
df.withColumn("new_col", func(col("col1")))
}
scala REPL在返回初始化值的类型方面非常有用
scala> val lkpUDF = udf{(i: Int) => if (i > 0) 1 else 0}
lkpUDF: org.apache.spark.sql.UserDefinedFunction = UserDefinedFunction(<function1>,IntegerType,List(IntegerType))
谢谢你,塞普特拉。你说得对,我犯了上述错误。但是,即使我试图只返回一个case类,我似乎也遇到了这个错误。谢谢你,塞普特拉。你说得对,我犯了上述错误。但是,即使我试图只返回一个case类,我似乎也遇到了这个错误。