我有一个看起来如此的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 1;'
,我会得到1。
我不确定为什么我无法从较大的JS函数返回值,并且我能够返回“通过”的较不复杂的数据。它应该每次都返回“东西”。出于我们的目的,tests
看起来像:
(.oo,foobar)
(.oo,bazfoobar)
(.oo,foobarbaz)
([Ff]oo,Bar)
([Ff]oo,bar)
其中第一列是表达式,第二列是字符串。我只是试图通过一个庞大的表达式列表来运行一个巨大的字符串列表。