对 scala udf 中重载定义的模糊引用

ambiguous reference to overloaded definition in scala udf

我有以下重载方法,输入可以是 Option[String]Option[Seq[String]]:

def parse_emails(email: => Option[String]) : Seq[String] = {
  email match {
    case Some(e : String) if e.isEmpty() => null
    case Some(e : String) => Seq(e)
    case _ => null
  }
}

def parse_emails(email: Option[Seq[String]]) : Seq[String] = {
  email match {
    case Some(e : Seq[String]) if e.isEmpty() => null
    case Some(e : Seq[String]) => e
    case _ => null
  }
}

我想在 Spark 中使用这个方法,所以我尝试将它们包装为一个 udf:

def parse_emails_udf = udf(parse_emails _)

但我收到以下错误:

error: ambiguous reference to overloaded definition,
both method parse_emails of type (email: Option[Seq[String]])Seq[String]
and  method parse_emails of type (email: => Option[String])Seq[String]
match expected type ?
def parse_emails_udf = udf(parse_emails _)

是否可以定义一个 udf 来包装两个备选方案?

或者是否可以创建两个具有相同名称的 udf,每个都指向一个重载选项?我尝试了以下方法,但抛出了另一个错误:

def parse_emails_udf = udf(parse_emails _ : Option[Seq[String]])

error: type mismatch;
 found   : (email: Option[Seq[String]])Seq[String] <and> (email: => Option[String])Seq[String]
 required: Option[Seq[String]]
def parse_emails_udf = udf(parse_emails _ : Option[Seq[String]])

Option[String]Option[Seq[String]] 具有相同的擦除 Option,所以即使 Spark 支持 udf 重载它也不会工作。

你可以做的是创建一个接受任何东西的函数,然后匹配参数并处理不同的情况:

def parseEmails(arg: Option[AnyRef]) = arg match {
  case Some(x) =>
    x match {
    case str: String =>
      ??? // todo
    case s: Seq[String] =>
      ??? // todo
    case _ =>
      throw new IllegalArgumentException()
    }
  case None =>
    ??? // todo
}