JavaScript UDF не работает в потоке воздуха, но работает в Snowflake

#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..." ]