Spark SQL UDF из строки, представляющей Scala-код во время выполнения - PullRequest
0 голосов
/ 08 мая 2018

Мне нужно иметь возможность зарегистрировать 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, не зная информации о типе.

1 Ответ

0 голосов
/ 08 мая 2018

Я думаю, вам было бы намного лучше, если бы вы не пытались генерировать / выполнять код напрямую, а определяли другой тип языка выражений и выполняли его. Нечто подобное ANTLR может помочь вам в написании грамматики этого языка выражений и создании синтаксического анализатора и деревьев абстрактного синтаксиса. Или даже комбинаторы парсера scala. Это, конечно, больше работы, но также гораздо менее рискованный и подверженный ошибкам способ разрешения выполнения пользовательских функций.

...