猪:多次调用外部方法

时间:2012-08-31 07:24:47

标签: apache-pig

我想在我的Pig中使用方法REPLACESUBSTRINGINDEXOF,但我无法以一种很好的方式使用它。

  • 第一种情况:REPLACE中的REGEX_EXTRACT_ALL

    data_split = FOREACH data GENERATE FLATTEN(REGEX_EXTRACT_ALL(line, 
        MY_REGULAR_EXPRESSION)) 
    AS (
        timestamp: chararray,
        url: chararray,
        REPLACE(url , '.*?://', '') AS clean_url: chararray);
    

我想使用REPLACE删除网址中的前导http://。在这种情况下,我得到:

Error during parsing. Encountered " "(" "( ""
  • 第二种情况:重复使用输出:

    ws = FOREACH data_split {
        clean_url = REPLACE(url , '.*?://', '');
        url_index = INDEXOF(clean_url, '/');
        web_server = SUBSTRING(clean_url, 0, url_index);
        GENERATE
            web_server,
            timestamp,
            ip
            ;
    

这种情况都不起作用,当我尝试重复使用clean_url之前调用的REPLACE时,我正在

Attempt to give operator of type 
    org.apache.pig.backend.hadoop.executionengine.physicalLayer.expressionOperators.POUserFunc       
    multiple outputs.  This operator does not support multiple outputs.

由于

1 个答案:

答案 0 :(得分:1)

我认为您无法在指定架构的UDF中使用AS clause。 我假设你已经以这种方式拥有它:

inp = LOAD 'data.txt' AS (line:chararray);
data_split = FOREACH inp 
               GENERATE FLATTEN(REGEX_EXTRACT_ALL(line, MY_REGULAR_EXPRESSION)) 
               AS (url:chararray, timestamp:chararray);

res = FOREACH data_split GENERATE REPLACE(url , '.*?://', ''), timestamp;
...

至于你的第二个问题:
使用哪种猪版?我认为这是一个bug,在版本0.10.0中,我无法重现它。