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