首页 > 解决方案 > JavaScript UDF 在 Airflow 中失败,但在 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;
    }
    ';

但是当我在 Airflow 中测试时:

common.snowflake.exceptions.SQLCompilationSnowflakeException:

001003 (42000): 019eb4f7-0603-05d7-0000-01b529072596:SQL 编译错误:在 '' 附近的位置 35 处解析错误行 6。位置 4 的第 6 行语法错误意外的 'const'。

处理查询时出错(019eb4f7-0603-05d7-0000-01b529072596):

创建或替换函数 dfp.extract_vcode(NAME VARCHAR) RETURNS string LANGUAGE javascript STRICT AS ' const regex = /[[]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
    ';

标签: airflowsnowflake-cloud-data-platform

解决方案


问题是 Snowflake 将尝试将传递给它的 SQL 拆分为多个由“;”分隔的语句 并且在那里使用的解析器不理解 javascript 语法。

解决方案是用 [] 包装你的 sql 查询。如果将单元素数组传递给 Snowflake 运算符,它将假定数组的每个元素都是一条语句,并且它甚至不会尝试拆分它。


推荐阅读