Scala Spark - udf列不受支持

时间:2017-11-19 15:15:41

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

我正在尝试使用等同于的udf

df.select(when(col("abc").isNotNull and col("abc") =!= "" and col("age") <= 18, 1).otherwise(0).alias("something"))

我宣布udf喜欢:

//return Int 0 or 1 if conditions are true 
val myudf_x = udf((col_name: String, col_value: String, num: Int) => {
  when(col_name.isNotNull and col_name =!= "" and col_value < num, 1).otherwise(0)

})

用法:

  df.select(
  "col_abc",
  myudf(col("col_abc"), col("age"), 18).alias("something")
)

但我收到错误

  

不支持类型为org.apache.spark.sql.Column的架构

我还尝试使用String类型的udf代替column类型

问题是什么?

谢谢

1 个答案:

答案 0 :(得分:6)

一个简单的区别:

  • 表达式对SQL类型(Columns)进行操作。
  • udfs对外部(Scala)类型进行操作。

如果你想要一个使用表达式DSL的函数:

import org.apache.spark.sql.Column

// You can use function:
// def f(col_name: Column, col_value: Column, num: Column) = ???
// I used closure syntax to highlight difference in types
val f: (Column, Column, Column) => Column = 
  (col_name: Column, col_value: Column, num: Column) =>  when(
    col_name.isNotNull and col_name =!= "unknown" and col_value < num, 
    1
  ).otherwise(0)

否则:

val g: UserDefinedFunction = udf(
  (col_name: String, col_value: String, num: Int) => {
    if (col_name != null && col_name != "unknown" && col_value < num) 1 else 0
  }
)

但是在当前形式下,udf不会进行类型检查(col_valueStringnumInt - 它们无法与{{1}进行比较}})。

也许您想要< / col_value.cast("int") < num