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

Posted

技术标签:

【中文标题】是否可以将 Option 与 spark UDF 一起使用【英文标题】:Is it possible to use Option with spark UDF 【发布时间】:2016-09-08 12:57:12 【问题描述】:

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

udf((oa: Option[String], ob: Option[String])) => …

以更实用的方式处理 null 值。

有没有办法做到这一点?

【问题讨论】:

【参考方案1】:

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

udf((oa: String, ob: String) => (Option(oa), Option(ob)) match 
  ...
)

使用Dataset 编码器:

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

df.as[(Option[String], Option[String])]

或添加一些隐式转换:

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"))

【讨论】:

以上是关于是否可以将 Option 与 spark UDF 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将字符串注册为 UDF?

我可以将 spark 数据帧作为参数发送给 pandas UDF

如何将复杂的外部变量(例如映射值)从 Spark 与 Java 中的驱动程序传递给 UDF?

将 pandas_udf 与 spark 2.2 一起使用

如何将 Set/HashSet 作为参数传递给 Spark 中的 UDF?

Spark 2.1 注册UDF到functionRegistry