是否可以将选项与spark UDF一起使用

Yan*_*san 2 scala apache-spark

我想用Option我的函数的输入类型。

\n\n

udf((oa: Option[String], ob: Option[String])) => \xe2\x80\xa6\n

\n\n

处理null以更实用的方式

\n\n

有没有办法做到这一点 ?

\n

zer*_*323 5

据我所知,这不是直接可能的。没有什么可以阻止你用以下方式包装参数Options

udf((oa: String, ob: String) => (Option(oa), Option(ob)) match {
  ...
})
Run Code Online (Sandbox Code Playgroud)

使用Dataset编码器:

val df = Seq(("a", None), ("b", Some("foo"))).toDF("oa", "ob")

df.as[(Option[String], Option[String])]
Run Code Online (Sandbox Code Playgroud)

或添加一些隐式转换:

implicit def asOption[T](value: T) : Option[T] = Option(value)

def foo(oa: Option[String], ob: Option[String]) = {
  oa.flatMap(a => ob.map(b => s"$a - $b"))
}

def wrap[T, U, V](f: (Option[T], Option[U]) => V) = 
  (t: T, u: U) => f(Option(t), Option(u))

val foo_ = udf(wrap(foo))
df.select(foo_($"oa", $"ob"))
Run Code Online (Sandbox Code Playgroud)