Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Spark UDF作为函数参数,UDF不在函数范围内_Scala_Apache Spark_Apache Spark Sql_Spark Dataframe_Udf - Fatal编程技术网

Scala Spark 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

我有一些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.
  .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类,我似乎也遇到了这个错误。