Мне нужно иметь возможность зарегистрировать udf из строки, которую я получу от веб-службы, т.е. во время выполнения я вызываю веб-службу, чтобы получить код scala, который составляет udf, скомпилировать его и зарегистрировать как UDF в контексте искры. В качестве примера, скажем, мой веб-сервис возвращает следующий scala-код в ответе json -
(row: Row, field:String) => {
import scala.util.{Try, Success, Failure}
val index: Int = Try(row.fieldIndex(field)) match {
case Success(_) => 1
case Failure(_) => 0
}
index
})
Я хочу скомпилировать этот код на лету, а затем зарегистрировать его в формате udf. У меня уже есть несколько вариантов, таких как использование панели инструментов, утилита Twitter eval и т. Д., Но я обнаружил, что мне нужно подробно указать типы аргументов метода при создании экземпляра для ex -
val code =
q"""
(a:String, b:String) => {
a+b
}
"""
val compiledCode = toolBox.compile(code)
val compiledFunc = compiledCode().asInstanceOf[(String, String) => Option[Any]]
Этот udf принимает две строки в качестве аргументов, поэтому мне нужно указать типы при создании объекта, например
compiledCode().asInstanceOf[(String, String) => Option[Any]]
Другой вариант, который я исследовал,
https://stackoverflow.com/a/34371343/1218856
В обоих случаях мне нужно знать число аргументов, типы аргументов и тип возвращаемого значения, чтобы создать экземпляр кода как метода. Но в моем случае, поскольку пользовательские файлы udf создаются, я не имею никакого контроля над количеством аргументов и их типами, поэтому я хотел бы знать, можно ли каким-либо образом зарегистрировать UDF, скомпилировав код scala, не зная аргумента номер и тип информации.
В ореховой оболочке я получаю код в виде строки, компилирую его и регистрирую как udf, не зная информации о типе.