1

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

  • 第一种情况:REPLACEREGEX_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://URL 中的前导。在这种情况下,我得到:

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.

谢谢

4

1 回答 1

1

我认为您不能在指定架构的UDF范围内使用 a 。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;
...

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

于 2012-09-04T16:32:56.277 回答