# #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,