我有一个看起来像这样的 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)
其中第一列是表达式,第二列是字符串。我只是想通过一个巨大的表达式列表来运行一个巨大的字符串列表。