雪花中的 UDF JavaScript 实现

Posted

技术标签:

【中文标题】雪花中的 UDF JavaScript 实现【英文标题】:UDF JavaScript implementation into Snowflake 【发布时间】:2020-01-16 16:18:34 【问题描述】:

我找到了有用的 JS 函数,我想在雪花的 UDF 中实现它,以便将复杂的计算转移到 dwh。

http://trentrichardson.com/2010/04/06/compute-linear-regressions-in-javascript/

尝试将以上内容作为 SQL 过程进行返工:

CREATE OR REPLACE PROCEDURE JS_LNR_REG(a array, b array)
RETURNS ARRAY
LANGUAGE javascript
AS
$$
function linearRegression(y,x)
var lr = ;
var n = y.length;
var sum_x = 0;
var sum_y = 0;
var sum_xy = 0;
var sum_xx = 0;
var sum_yy = 0;

for (var i = 0; i < y.length; i++) 

    sum_x += x[i];
    sum_y += y[i];
    sum_xy += (x[i]*y[i]);
    sum_xx += (x[i]*x[i]);
    sum_yy += (y[i]*y[i]);
 

lr['slope'] = (n * sum_xy - sum_x * sum_y) / (n*sum_xx - sum_x * sum_x);
lr['intercept'] = (sum_y - lr.slope * sum_x)/n;

return lr;      ; $$;

执行失败并出现错误:SQL compilation error: Invalid identifier,这很奇怪,因为已创建过程。

SELECT JS_LNR_REG('[2,4,5,3,1]', '[5.2, 5.7, 5.0, 4.2]');

【问题讨论】:

【参考方案1】:

你快到了。要传递数组,请尝试使用 ARRAY_CONSTRUCT 或 PARSE_JSON,如下所示:

SELECT JS_LNR_REG(array_construct(1,2,3,4), array_construct(5,4,3,2));
SELECT JS_LNR_REG(parse_json('[1,2,3,4]'), parse_json('[5,4,3,2]'));

要使代码正常工作,请将其设为返回 OBJECT 的 FUNCTION,并确保从 UDF 中实际调用 linearRegression():

CREATE OR REPLACE FUNCTION JS_LNR_REG(A array, B array)
  RETURNS OBJECT
  LANGUAGE JAVASCRIPT
  STRICT
AS
$$
function linearRegression(y,x)
  var lr = ;
  var n = y.length;
  var sum_x = 0;
  var sum_y = 0;
  var sum_xy = 0;
  var sum_xx = 0;
  var sum_yy = 0;

  for (var i = 0; i < y.length; i++) 

      sum_x += x[i];
      sum_y += y[i];
      sum_xy += (x[i]*y[i]);
      sum_xx += (x[i]*x[i]);
      sum_yy += (y[i]*y[i]);
   

  lr['slope'] = (n * sum_xy - sum_x * sum_y) / (n*sum_xx - sum_x * sum_x);
  lr['intercept'] = (sum_y - lr.slope * sum_x)/n;

  return lr;
        

  return linearRegression(A,B)
; $$;

希望对您有所帮助。

【讨论】:

return linearRegression(A,B) 可以用作位置参数吗? A 和 B 是 lineanRegression() 调用中的位置参数,是这个意思吗? 我重新解释一下 ;) CREATE OR REPLACE FUNCTION JS_LNR_REG(A array, B array)。 CREATE 语句中的 A 和 B 如何知道将这些数组传递给 return linearRegression(A,B) 啊,是的,它们确实是有位置的。

以上是关于雪花中的 UDF JavaScript 实现的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 中的雪花 UDF 未按预期计算

雪花 UDF 和数据加密

需要从 JAVA UDF 连接雪花表

雪花 UDF 调用“显示共享”功能

有没有啥方法可以在雪花中使用 UDF 而不是扁平化?

雪花 SQL udf 的输入列表