对 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
}
我有以下重载方法,输入可以是 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
}