Scala 是否可以将选件与spark UDF一起使用
我想使用Option作为函数的输入类型 udfoa:选项[String],ob:选项[String]=>… 以更有效的方式处理空值Scala 是否可以将选件与spark UDF一起使用,scala,apache-spark,Scala,Apache Spark,我想使用Option作为函数的输入类型 udfoa:选项[String],ob:选项[String]=>… 以更有效的方式处理空值 有没有办法做到这一点?据我所知,这是不可能的。没有任何东西可以阻止您使用选项包装参数: 使用数据集编码器: val df = Seq(("a", None), ("b", Some("foo"))).toDF("oa", "ob") df.as[(Option[String], Option[String])] 或者添加一些隐式转换: implicit def
有没有办法做到这一点?据我所知,这是不可能的。没有任何东西可以阻止您使用选项包装参数: 使用数据集编码器:
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"))
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"))