Udf с несколькими аргументами терпит неудачу при вызове в dataframel - PullRequest
0 голосов
/ 19 июня 2020

Я работаю в Scala и искру 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)))
}

Вероятно, я не знаю, как передать строку как JSONOBJECT внутри udf или что-то еще. Я получаю следующую ошибку времени выполнения:

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)

Как мне заставить его работать?

1 Ответ

0 голосов
/ 20 июня 2020

попробуйте ниже (наивный подход) -

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("")))
}
...