#airflow #snowflake-cloud-data-platform
Вопрос:
У меня есть функция ниже, которая работает, когда я запускаю snowflake:
CREATE OR REPLACE FUNCTION dfp.extract_vcode(NAME VARCHAR)
RETURNS string
LANGUAGE javascript
STRICT
AS '
const regex = /[[]v=([0-9] )/ig;
let s = NAME.match(regex);
if (s != null) {
return s[0].split('=')[1];
} else {
return null;
}
';
но когда я тестирую в воздушном потоке:
обычное.снежинка.исключения.Исключение SQLCompilationSnowflakeException:
001003 (42000): 019eb4f7-0603-05d7-0000-01b529072596: Ошибка компиляции SQL: строка ошибки синтаксического анализа 6 в позиции 35 рядом «. строка синтаксической ошибки 6 в позиции 4 неожиданная «константа».
Ошибка произошла при обработке запроса(019eb4f7-0603-05d7-0000-01b529072596):
СОЗДАЙТЕ ИЛИ ЗАМЕНИТЕ ФУНКЦИЮ dfp.extract_vcode(ИМЯ VARCHAR) ВОЗВРАЩАЕТ строковый ЯЗЫК javascript, СТРОГИЙ КАК ‘ регулярное выражение const = /[[]v=([0-9] )/ig
—— У меня есть еще один UDF, который отлично работает:
CREATE OR REPLACE FUNCTION dfp.parse_metadata(DATA varchar)
RETURNS OBJECT
LANGUAGE javascript
STRICT
AS '
if (!DATA) {
return {}
}
let dict = {}
const parts = DATA.split("|")
parts.forEach((p) => {
const split = p.split("=")
dict[split[0]] = split[1]
})
return dict
';
Комментарии:
1. Пожалуйста, добавьте свой код воздушного потока.
2. @Elad Я добавил то, что у меня есть в коде my .sql выше, вот что выдает мне ошибку
3. Если этот SQL работает как на Snowflake, то проблема либо в коде воздушного потока, либо в sdk snowflake python. Чтобы знать, нам нужно увидеть ваш код. Поскольку это синтаксическая ошибка, скорее всего, ваш запрос также не выполняется на Snowflake. Вы проверили это?
4. Да, это работает в Snowflake, я проверил это. Ошибка заключается в том, что это связано с «const», но когда я изменил его на var и добавил оператор «если», он выдает ту же ошибку
5. @Elad также я добавил еще один UDF, который мы используем, который отлично работает в потоке воздуха
Ответ №1:
Проблема в том, что Snowflake попытается разделить переданный ему SQL на несколько операторов, разделенных символом»;», а используемый там синтаксический анализатор не понимает синтаксис javascript.
Решение состоит в том, чтобы обернуть ваш sql-запрос с помощью []. Если вы передадите одноэлементный массив оператору Snowflake, он будет считать, что каждый элемент массива является одним оператором, и даже не будет пытаться разделить его.
Комментарии:
1. спасибо, что ответили. Вы упомянули, чтобы обернуть мой запрос с помощью [], в этой части моего запроса используется UDF.: выберите ОБЪЕДИНИТЬ( DFP.extract_vcode(ИМЯ), DFP.extract_vcode(ИМЯ 5), DFP.extract_vcode(ИМЯ 4), ) как код отображения ИЗ dfp.ads au ), Должен ли я обернуть всю эту часть в [ ] ??
2. О, я понимаю, что вы имеете в виду, я должен был прочитать это более внимательно. Я удалил ; после каждой строки, и это тоже сработало. Спасибо
3. Круто! Я имел в виду, чтобы обернуть весь sql в вызов оператора. Там, где у тебя было
sql= "CREATE"
…. это должно бытьsql = [ "CREATE..." ]