2012-08-31 85 views
1

我想在我的Pig中使用方法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_urlREPLACE,我得到

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

我認爲你不能在指定模式的AS clause內使用UDF。 我假設你已經擁有它以這樣的方式

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我無法複製它。