javascript函数在雪花函数内提供NULL

时间:2019-05-04 23:27:09

标签: javascript snowflake-datawarehouse

我已经使用Javascript在雪花内创建了一个函数来计算字符串距离,但是该函数给了我NULL值。我无法调试该功能。

代码:

CREATE OR REPLACE FUNCTION cat_map_trial4(a string,b string)
RETURNS STRING
LANGUAGE JAVASCRIPT
AS
$$
function levenshteinDistance(s1, s2) {
    if (!s1.length) return toString(s2.length);
    if (!s2.length) return toString(s1.length);

    return toString(Math.min(
        levenshteinDistance(s1.substr(1), s2) + 1,
        levenshteinDistance(s2.substr(1), s1) + 1,
        levenshteinDistance(s1.substr(1), s2.substr(1)) + (s1[0] !== s2[0] ? 1 : 0)
    ) + 1);
}
$$


select cat_map_trial4('stackoverflow', 'stack') as dist;

输出

dist
NULL

JavaScript有什么问题? 任何帮助,将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

您的代码中存在许多问题

  • 您定义了一个函数,但未使用它,您需要在最后添加一个调用
  • 您错误地使用了toString,如果您坚持使用字符串,请使用String(value)
  • 如果您使用字符串,则不能将它们加上'+'来添加其数字值...
  • 您最后没有必要的+1
  • 您使用的算法执行速度非常慢,应该使用更快的方法,请阅读various ways to compute it

这是一个更正的版本(仍然很慢,但是可以工作):

CREATE OR REPLACE FUNCTION cat_map_trial4(a string,b string)
RETURNS STRING
LANGUAGE JAVASCRIPT
AS
$$
function levenshteinDistance(s1, s2) {
    if (!s1.length) return s2.length;
    if (!s2.length) return s1.length;
    return Math.min(
        levenshteinDistance(s1.substr(1), s2) + 1,
        levenshteinDistance(s2.substr(1), s1) + 1,
        levenshteinDistance(s1.substr(1), s2.substr(1)) + (s1[0] !== s2[0] ? 1 : 0)
    );
}
return levenshteinDistance(A, B);
$$;

但是您的代码最大的问题是它完全不必要,因为Snowflake非常出色,它提供了内置的快速EDITDISTANCE函数:)