2016-09-08 4 views
1

zu verwenden Ich möchte Option als Eingabetyp für meine Funktionen verwenden.Ist es möglich, Option mit Funken UDF

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

null Werte in einer funktionalen Weise zu handhaben.

Gibt es eine Möglichkeit, das zu tun?

Antwort

3

Soweit ich weiß ist es nicht direkt möglich. Nichts hält Sie Argumente mit Options Verpackung:

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

mit Dataset Geber:

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

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

oder das Hinzufügen einiger implizite Konvertierungen:

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