Pig Latin中的STRSPLIT和REGEX_EXTRACT_ALL

时间:2012-11-15 11:39:11

标签: hadoop apache-pig

我有以下文件:

File
----
12-3    John    121
 5-1    Sam     122

文件是制表符(\t)分隔的。我正在将行加载为line:chararray,因为我希望数据不会在单个字段中拆分。

现在,我想将详细信息(12-3和5-1)作为单独的数据提取并存储。

我正在尝试STRSPLITREGEX_EXTRACT_ALL,但数据似乎不匹配。

splitdata = FOREACH filedata {
    regex = REGEX_EXTRACT_ALL(line, '^([0-9]*)\\-([0-9]*)');
    split = STRSPLIT(line, '\\t', 1);
    GENERATE regex, split;
};

这就是我想要的最终数据:

(12, 3, 12-3    John    121)
( 5, 1,  5-1    Sam     122)

2 个答案:

答案 0 :(得分:4)

怎么样:

A = LOAD .... AS (line:chararray);
B = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL(line, '^(.*)\t(.*)\t(.*)$')) 
      AS (id:chararray, name:chararray, nameid:chararray);
C = FOREACH B GENERATE FLATTEN(REGEX_EXTRACT_ALL(id, '^([0-9]*)\\-([0-9]*)')), 
      id, name, nameid;
STORE C INTO ...

如果您在加载时将行拆分为\ t的字段,则可以跳过B = ...

答案 1 :(得分:4)

谢谢Lorand。

由于您对如何使用REGEX_EXTRACT_ALL有了一些了解,以下是我最终使用它的方法。

FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL(line, '^([0-9]*)\\-([0-9]*).*')) 
  AS (FIELD1:chararray, FIELD2:chararray), line;

非常有趣的是,当'^([0-9]*)\\-([0-9]*)'适用时,'^([0-9]*)\\-([0-9]*).*'的Matcher.matches()失败。