1

我有一个看起来像这样的 JS udf:

is_match.outputSchema = 'matched:chararray, match_against:chararray, match_candidate:chararray';
function is_match (match_against, match_candidate) {
    var mre = new RegExp(match_against);
    return { word:mre.test(match_candidate), word:match_against, word:match_candidate };
}

调用它的猪看起来像这样:

register '<full path omitted>my_match.js' using javascript as js_match;

regexes = load <stuff> using PigStorage() as ( regex:chararray );
tests   = load <stuff> using PigStorage() as ( agent:chararray );

regexes = distinct regexes;
tests = distinct tests;

tests = cross regexes, tests;

matched = foreach tests generate js_match.is_match( regex, agent );

我得到的是大量的空元组:

((,,))
((,,))
((,,))
((,,))

如果我将 JS 中的函数切换为如下所示:

is_match.outputSchema = 'foo:int';
function is_match (foo, bar) {
    return 1;
}

我实际上得到:

(1.0)
(1.0)
(1.0)

这是我所期望的。但是,当我将 JS 的返回值更改为返回我的任何实际数据时,它不会。如果我做出 return 声明'return 1;',我会得到 1。

我不确定为什么我无法从较大的 JS 函数返回值,而我能够返回“通过”的不太复杂的数据。它应该每次都返回“某物”。对于我们的目的,tests看起来像:

(.oo,foobar)
(.oo,bazfoobar)
(.oo,foobarbaz)
([Ff]oo,Bar)
([Ff]oo,bar)

其中第一列是表达式,第二列是字符串。我只是想通过一个巨大的表达式列表来运行一个巨大的字符串列表。

4

0 回答 0