2

我有以下文件:

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

该文件以制表符 ( \t) 分隔。我正在加载该行,line:chararray因为我希望数据不被拆分到各个字段中。

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

我正在尝试使用STRSPLITand REGEX_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)
4

2 回答 2

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 = ...

于 2012-11-15T13:32:41.740 回答
4

谢谢洛兰德。

既然您对如何使用 有一点想法REGEX_EXTRACT_ALL,这就是我最终使用它的方式。

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

很有趣的是,Matcher.matches() 失败了'^([0-9]*)\\-([0-9]*)'while 为'^([0-9]*)\\-([0-9]*).*'.

于 2012-11-15T13:59:24.990 回答