【问题标题】:Udf with multiple argument failes when called in dataframel在数据框中调用具有多个参数的 Udf 失败
【发布时间】:2020-10-09 04:45:41
【问题描述】:

我在 Scala 和 spark sql 中工作,我想在其中调用带有多个参数的 UDF。我无法弄清楚我的电话出了什么问题

udf 是

private def parseJsonUdf: UserDefinedFunction = udf(parseJson _)
def parseJson (json: org.json.JSONObject, arg1: String, arg2: String = ""): String = {
  ***
}

我是这样称呼的,这里的字段是Seq[String],数据列包含json字符串

for(field <- fields){
 df.withColumn(field, parseJsonUdf(col("data"), lit(field)))
}

可能我不知道如何在 udf 或其他东西中将字符串作为 JSONOBJECT 传递。我收到以下运行时错误

java.lang.ClassCastException: ********$$parseJsonUdf$1 cannot be cast to scala.Function2

    at org.apache.spark.sql.catalyst.expressions.ScalaUDF.<init>(ScalaUDF.scala:107)
    at org.apache.spark.sql.expressions.UserDefinedFunction.apply(UserDefinedFunction.scala:71)

我怎样才能让它工作?

【问题讨论】:

  • 尝试将第三个参数设为lit("")
  • 需要更多关于“数据”列的外观以及“数据”列的类型的信息。
  • @SathiyanS:数据列的类型是字符串,里面的数据是json字符串。
  • @SomeshwarKale:当我添加第三个 arg -lit("") 时,我收到此错误 java.lang.String cannot be cast to org.json.JSONObject
  • 只需将其作为字符串传递,然后在 UDF 中将其转换为 JSONObject,然后随心所欲。

标签: json scala dataframe apache-spark user-defined-functions


【解决方案1】:

试试下面(天真的方法)-

private def parseJsonUdf: UserDefinedFunction = udf(parseJson _)
def parseJson (jsonString: String, arg1: String, arg2: String = ""): String = {
val jsonObj:org.json.JSONObject = // parse  jsonString -> JSONObject
***
}

然后调用-

for(field <- fields){
 df.withColumn(field, parseJsonUdf(col("data"), lit(field), lit("")))
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 2022-07-26
    相关资源
    最近更新 更多