airflow - 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
';
解决方案
问题是 Snowflake 将尝试将传递给它的 SQL 拆分为多个由“;”分隔的语句 并且在那里使用的解析器不理解 javascript 语法。
解决方案是用 [] 包装你的 sql 查询。如果将单元素数组传递给 Snowflake 运算符,它将假定数组的每个元素都是一条语句,并且它甚至不会尝试拆分它。
推荐阅读
- android - Transloadit Dependency has different version for the compile (x) and runtime (y)
- javascript - 为什么 array[0] = array[0].toUpperCase() 工作,而 array[0][0] = array[0][0].toUpperCase() 不是
- bash - Shell - 表达式中的语法错误(错误标记为“16”)
- api - 通过 API 调用设置 GitHub 默认分支
- html - 在引导卡元素内创建一组按钮
- ruby-on-rails - 在没有数据库的 heroku 应用程序中运行 ruby 测试
- php - 带有条件的Vue循环,如PHP
- java - 如何使用具有类的通用类型的 ObjectMapper 反序列化 JsonString
- python - 没有NVIDIA的Tensorflow-GPU,可能吗?
- php - 如何使用 Symfony 的 Messenger 组件和 Enqueue 适配器使用来自 Cloud Pub/Sub 的消息?