尝试将Map作为参数传递给Udf时没有typeTag异常

时间:2016-07-14 08:38:53

标签: scala apache-spark udf

我一直在尝试编写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。 是因为我没有指定任何返回类型的函数吗?

1 个答案:

答案 0 :(得分:0)

udf()函数中的第一个参数应该有一些与sql类型兼容的类型。它实际上表示您要发送到该字段的字段的类型。对于Map [String,String],在sql端没有关联的类型。