我正在尝试使用等同于的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
类型
问题是什么?
谢谢
答案 0 :(得分:6)
一个简单的区别:
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_value
是String
而num
是Int
- 它们无法与{{1}进行比较}})。
也许您想要<
/ col_value.cast("int") < num
?