JavaScript内存不足错误:超出UDF线程内存限制-雪花

时间:2020-01-03 09:29:59

标签: javascript user-defined-functions snowflake-cloud-data-platform variant

我正在尝试使用javascript UDF合并两个变量行,但是我的每个变量行都有大约12500个键。 我的udf定义如下:

CREATE OR REPLACE FUNCTION merge_json(EXT_ROW VARIANT, STG_ROW VARIANT)
    RETURNS variant
    LANGUAGE JAVASCRIPT
    AS 
    $$
    function extend(ext, stg) {
      if(ext == null)ext=stg
      for (var key in stg) {
          if (stg.hasOwnProperty(key)) ext[key] = stg[key];
      }
      return ext;
    }
    return extend(EXT_ROW, STG_ROW)
    $$;

从雪花文档中,我知道万一脚本使用过多的内存或遇到无限循环,然后udf失败,因此我尝试删除上述函数中的循环并使其如下所示:

 CREATE OR REPLACE FUNCTION merge_json_v1(EXT_ROW VARIANT, STG_ROW
 VARIANT)
     RETURNS variant
     LANGUAGE JAVASCRIPT
     AS 
     $$
     function extend(ext, stg) {
       if(ext == null)ext=stg
       let merged_row = Object.assign(ext, stg);
       return merged_row;
     }
     return extend(EXT_ROW, STG_ROW)
     $$;

仍然功能抛出错误。有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

用OBJECT替换VARIANT并消除内部包装函数可能会减少一些开销。

例如:

CREATE OR REPLACE FUNCTION merge_json_v1(EXT_ROW OBJECT, STG_ROW OBJECT)
RETURNS OBJECT
LANGUAGE JAVASCRIPT
AS 
$$
 return EXT_ROW ? Object.assign(EXT_ROW, STG_ROW) : STG_ROW
$$;

否则,您可以增加仓库的大小。还要检查查询配置文件,以防其他原因引起问题。