我试图返回一个Map,从自定义项与在如果否则,并得到以下例外,任何指针请?
java.lang.unsupportedoperationexception:不支持任何类型的架构
import org.apache.spark.sql.functions.{col, udf}
import org.apache.spark.sql.functions._
val df2 = Seq(
("1", Map("Fld1" -> "USA","Fld2" -> "UK")),
("2", Map("Fld1" -> "Germany", "Fld2" -> "Portugal")),
("3", Map("Fld1" -> "France", "Fld2" -> "Paris"))
).toDF("id", "map")
val getmapUdf = udf((map1: Map[String, String]) => {
val fl1 = map1.getOrElse("Fld1","unknown")
val fl2 = map1.getOrElse("Fld2","unknown")
if (fl1 =="Germany")
{
Map("key1" -> "G")
}
else if(fl1 =="France")
{
if (fl2 =="UK")
{
Map("key1" ->"U")
}
else
{
Map("key1" ->"Y")
}
}
else if(fl1 =="France")
{
Map("key1" ->"G")
}
})
var temp2 = df2.withColumn("mymap", getmapUdf($"map"))
temp2.show(false)
2条答案
按热度按时间dgiusagp1#
得到这个错误是因为您的udf函数并不总是返回类型
Map[String,String]
,您使用的if/else语句在不满足条件时不包含默认值,因此返回类型为any。但是,实际上,您可以在不使用udf的情况下使用
when
功能:无论如何,如果您想使用自定义项,请修改函数以返回
Option[Map[String,String]]
. 像这样:jtw3ybtb2#
如果你想继续使用你正在做的事情,我将尝试在这里提供一个替代答案,但是@blackbishop answer涵盖了实现相同内容的大多数选项。
为了使代码正常工作,只需在自定义项中进行更改,以确保有else条件返回如下所示的默认Map,然后就不会出现该错误。