javascript - Snowflake UDF 在使用“LIMIT”时表现不同
问题描述
我创建了一个评估行的 UDF。在大多数情况下它工作得很好,但有时它会表现得很奇怪。请参见下面的示例。这些是完全相同的查询。一个有“限制”,另一个没有。这里的总记录数是 32,但我只是为了示例添加了 Limit 1000。您知道为什么这两个查询的行为不同吗?
解决方案
功能代码:
create or replace function new_row_evaluator
(b varchar, m datetime, f DATETIME, t datetime )
returns string
language javascript
as '
if (typeof tmp_barcode === "undefined") {
tmp_barcode = B;
tmp_fromdate = F;
tmp_todate = T;
return "1";
}
if (tmp_barcode == B) {
if (M >= tmp_fromdate && M <= tmp_todate) {
return "0";
} else {
tmp_fromdate = F;
tmp_todate = T;
return "1";
}
} else {
tmp_barcode = B;
tmp_fromdate = F;
tmp_todate = T;
return "1";
} ';
我假设 UDF 正在使用某种全局状态tmp_barcode
。
Snowflake 通常在 UDF 的迭代之间保留 JavaScript 全局状态。但是,您不应依赖先前对函数调用之间可用的全局状态的修改。此外,您不应假定所有行都将在同一个 JavaScript 环境中执行。
推荐的模式是使用 JavaScript 的全局变量语义保证相关代码只被评估一次。例如:
var setup = function() { /* SETUP LOGIC */ }; if (typeof(setup_done) === "undefined") { setup(); setup_done = true; // setting global variable to true }
请注意,此机制仅对缓存代码评估的效果是安全的。不能保证在初始化之后将为所有行保留全局上下文,并且任何业务逻辑都不应该依赖它。
推荐阅读
- spring-security - 如何使用受 OAuth2 保护的 REST 服务:使用 github
- java - 如何在 Android Studio 中将 JRE 更改为 JDK8?
- rust - 禁用堆分配的 Rust 编译器标志是什么?
- vba - 如何为每张纸上的特定行设置求和公式 VBA?
- python - 在 Tensorflow 上训练卷积神经网络时 GPU 内存不足
- c# - 正则表达式在数组中无法正常工作
- java - Drools 7,每当激活规则时的事件侦听器(即使部分匹配)
- python - 无法将数据框保存到本地 Mac 机器
- ios - Swift,segue 将视图控制器从标签栏控制器中分离出来
- sharepoint - Office 365 图像搜索是否有效?如果是这样,怎么做?