Вызов собственной функции в UDF в bigquery

# #sql #google-bigquery #user-defined-functions #bigquery-udf

Вопрос:

Я пытаюсь преобразовать наши устаревшие функции в стандартный SQL и поэтому использую UDFs в качестве инструмента для повторного использования старых имен функций с помощью собственных функций.

Здесь у меня есть мой UDF to_char, и внутри я использую параметры для запуска FORMAT_DATE, но когда я выполняю его, даже если создана процедура, я получаю ошибки без дополнительной информации. Как только подпрограмма была создана и я закомментировал код, появились ошибки, так как такая функция to_char не найдена

Если я запускаю a CREATE TEMP FUNCTION , я получаю очень долгое время загрузки(около 30-90 секунд), и это, очевидно, не может быть правильным.

 CREATE OR REPLACE FUNCTION mytable.TO_CHAR(dstamp DATETIME, fmt STRING)
RETURNS STRING AS
(
    FORMAT_DATE(fmt, dstamp)
);

SELECT
    TO_CHAR(End_Time, 'yyyy-mm') AS Month_and_Year,
 

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

кстати, запускаю это в GBQ.

Комментарии:

1. почему бы просто не использовать встроенную функцию как есть ? FORMAT_DATE? Кроме того, знаете ли вы — вы можете создавать постоянные функции? каков ваш реальный вариант использования? пожалуйста, уточните …

2. У меня есть куча устаревшего кода, который мы хотим перевести на стандартный SQL, и поэтому вместо изменения функций на встроенные я хочу создать свою собственную, например функцию to_char, которая делает по сути то же самое, используя FORMAT_DATE. Да, я знаю, разве ФУНКЦИЯ СОЗДАНИЯ ИЛИ ЗАМЕНЫ не создаст постоянную функцию??

Ответ №1:

Вам нужна ссылка на UDF с префиксом набора данных, иначе BigQuery подумает, что это встроенная функция или временный UDF. В вашем случае просто измените TO_CHAR на mytable.TO_CHAR . Предполагая mytable , что вы на самом деле являетесь набором данных.

 SELECT mytable.TO_CHAR(End_Time, 'yyyy-mm') AS Month_and_Year,