我有以下文件:
File
----
12-3 John 121
5-1 Sam 122
文件是制表符(\t
)分隔的。我正在将行加载为line:chararray
,因为我希望数据不会在单个字段中拆分。
现在,我想将详细信息(12-3和5-1)作为单独的数据提取并存储。
我正在尝试STRSPLIT
和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)
答案 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()失败。