使用 Scala 从 Spark 的 withColumn 中调用 udf 时出错

Posted

技术标签:

【中文标题】使用 Scala 从 Spark 的 withColumn 中调用 udf 时出错【英文标题】:Error while calling udf from within withColumn in Spark using Scala 【发布时间】:2016-07-04 02:21:28 【问题描述】:

我在使用 Scala 从 Spark 的 withColumn 中调用 udf 时收到错误消息。 使用 SBT 构建时会发生此错误。

val hiveRDD = sqlContext.sql("select * from iac_trinity.ctg_us_clickstream")
hiveRDD.persist()

val trnEventDf = hiveRDD
  .withColumn("system_generated_id", getAuthId(hiveRDD("session_user_id")))
  .withColumn("application_assigned_event_id", hiveRDD("event_event_id"))


val getAuthId = udf((session_user_id:String) => 
    if (session_user_id != None)
        if (session_user_id != "NULL")
            if (session_user_id != "null")
            session_user_id
          else "-1"
        else "-1"
    else "-1"
  

)

我收到的错误是 -

scala:58: No TypeTag available for String
val getAuthId = udf((session_user_id:String) => 

当我使用 (session_user_id:Any) 而不是 (session_user_id:String) 时,它可以正确编译,但在运行时失败,因为在 Spark 中无法识别 Any。 请告诉我如何处理。

【问题讨论】:

错误与否这没有意义。 String 类的对象不能是 None 【参考方案1】:

您是否尝试过明确您的类型?

udf[String, String]((session_user_id:String)...

【讨论】:

是的,我已经尝试过明确 - val getAuthId = udf[String,String]((session_user_id:String) => if (session_user_id == None) .... 错误是一样的 - scala:57: 没有可用于字符串的 TypeTag [错误] val getAuthId = udf[String,String]((session_user_id:String) => if (session_user_id == None)"-1" @preitamojha 你确定你正在执行你给我们的相同代码吗?这似乎不太可能不起作用。我无法重现错误。

以上是关于使用 Scala 从 Spark 的 withColumn 中调用 udf 时出错的主要内容,如果未能解决你的问题,请参考以下文章

使用 Scala 从 Spark 的 withColumn 中调用 udf 时出错

Spark:使用 Spark Scala 从 Kafka 读取 Avro 消息

无法使用 Spark/Scala 从 JSON 嵌套键值对创建列和值

Spark,Scala在从文件读取后无法正确创建视图

如何使用反射从scala调用spark UDF?

如何使用 Scala 从 Spark 中的列表或数组创建行