JavaScript UDF 在 Airflow 中失败但在 Snowflake 中有效
JavaScript UDF fails in Airflow but works in 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 compilation
error: parse error line 6 at position 35 near ''. syntax error
line 6 at position 4 unexpected 'const'.
Error occured while processing
query(019eb4f7-0603-05d7-0000-01b529072596):
CREATE OR REPLACE FUNCTION 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
';
问题是 Snowflake 会尝试将传递给它的 SQL 拆分成多个语句,用“;”分隔并且那里使用的解析器不理解 javascript 语法。
解决方案是用 [] 包装您的 sql 查询。如果将单元素数组传递给 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 compilation error: parse error line 6 at position 35 near ''. syntax error line 6 at position 4 unexpected 'const'.
Error occured while processing query(019eb4f7-0603-05d7-0000-01b529072596):
CREATE OR REPLACE FUNCTION 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
';
问题是 Snowflake 会尝试将传递给它的 SQL 拆分成多个语句,用“;”分隔并且那里使用的解析器不理解 javascript 语法。
解决方案是用 [] 包装您的 sql 查询。如果将单元素数组传递给 Snowflake 运算符,它会假定数组的每个元素都是一条语句,甚至不会尝试拆分它。