【发布时间】:2016-07-14 08:38:53
【问题描述】:
我一直在尝试编写 UDF。当我尝试使用 SBT 构建包时收到错误消息。
val getUiPropx = udf((prop_map:Map[String, String],prop:String,sub_prop:String,alt_prop:String) => {
if (prop_map.contains(prop)) {
val ui_element_map = jsonStrToMap(prop_map(prop))
if (ui_element_map.contains(sub_prop)) ui_element_map(sub_prop).toString() else "-1"
}
else {
if (prop_map.contains(alt_prop)) prop_map(alt_prop).toString() else "-1"
} })
我收到的错误是 -
scala:87: No TypeTag available for Map[String,String] [error] val getUiPropx = udf((prop_map:Map[String, String],prop:String,sub_prop:String,alt_prop:String) => {
问题是我什至还没有调用 udf,但我仍然收到错误。 有人可以解释一下错误吗?
编辑 -
正如下面的答案和线程中所建议的那样 - Pass array as an UDF parameter in Spark SQL 我将 udf 调用修改为 -
def getUiPropx(prop_map:Map[String, String],prop:String,sub_prop:String,alt_prop:String) = {
udf(() => {
if (prop_map.contains(prop)) {
val ui_element_map = jsonStrToMap(prop_map(prop))
if (ui_element_map.contains(sub_prop)) ui_element_map(sub_prop).toString() else "-1"
}
else {
if (prop_map.contains(alt_prop)) prop_map(alt_prop).toString() else "-1"
}
})}
然后我调用它 -
val trnUiEventDf = hiveDf..withColumn("ui_element_id",getUiPropx(myMap,"ui_element","id","ui_element_id")(col("ep_map")))
我仍然在运行时收到一条错误消息,提示 Unit is not allowed in dataframes。 是不是因为我没有指定函数的任何返回类型?
【问题讨论】:
-
udf( (el1, el2, el3)..) 定义中的第一个元素是返回类型定义。但对你来说 prop_map 似乎是传递给函数的参数之一。
-
那是我为 udf 明确定义类型的时候。不是当我对 udf 进行隐式定义时。
标签: scala apache-spark udf