Добавить пользовательские функции с оптимизацией (следовательно, не как UDF) - PullRequest
0 голосов
/ 29 августа 2018

Я борюсь с оптимизацией моих пользовательских функций, которые в настоящее время передаются как UDF. Мы принимаем преобразования конфигурируемо через формат, подобный приведенному ниже, и, следовательно, не можем явно кодировать логику преобразования для каждого параметра.

transforms: [

    {col: "id", expr: """ cast(someCustomFunction(aColumn) as string) """}
    {col: "date", expr: """ date_format(cast(unix_timestamp(someColumn, "yyyyMMddHHmmss") as Timestamp), "yyyyMMdd") """}
  ],

Я зарегистрировал someCustomFunction, но я хочу оптимизировать это, каким-то образом не создавая его как UDF, так как UDF Spark blackboxes. Я хочу знать, каков наилучший подход для достижения этого (и затем спать спокойно):

  1. Расширение правил использования катализатора optmiser не помогает, так как нет логического выбора, который я могу дать заранее.
  2. Функции столбцов Если я их использую, где / как мне их зарегистрировать (если есть способ их вообще зарегистрировать)
  3. Пользовательские преобразования : Поскольку я передаю строки неизвестных преобразований, как на самом деле использовать пользовательские преобразования (поможет код)
  4. Предварительная регистрация пользовательских функций , как в пакете o.a.s.sql.functions. Все объекты в этом пакете являются защищенными или частными. Должен ли я скопировать весь код spark в локальный каталог, добавить свои функции и заставить мое приложение использовать мою локальную сборку spark (надеюсь, что нет). Если нет, как правильно расширить spark-sql для включения моих функций?
  5. Есть ли какой-то другой, более легкий способ, который я пропустил?

Я боролся с этим в течение 3 дней, поэтому любая помощь (желательно с примером кода) была бы гигантским кармическим брауни.

...