gpt4 book ai didi

Scala Spark - 不支持 udf 列

转载 作者:行者123 更新时间:2023-12-05 09:17:39 33 4
gpt4 key购买 nike

我正在尝试使用 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")
)

但我得到一个错误:

Schema for type org.apache.spark.sql.Column is not supported

我也用 String 试过 udf类型而不是 column类型

问题是什么?

谢谢

最佳答案

简单的区分:

  • 表达式对 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_valueString 并且 numInt - 它们无法与 < 进行比较)。

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

关于Scala Spark - 不支持 udf 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47378426/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com