我想在我的Pig中使用方法REPLACE
,SUBSTRING
和INDEXOF
,但我无法以一种很好的方式使用它。
第一种情况: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.
由于
答案 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中,我无法重现它。