我是PIG和shell模式匹配的新手。
我有一个文件,第3列的内容类似于" M2534896R402Qnew"。 我需要在' M'之间提取数字。和' R'。
在PIG脚本中,
raw = load 'record.txt' using PigStorage('\t') as (chararray, chararray,chararray,chararray);
data = stream raw through `shell command`;
如何更改第3列,以便所有数据的第3列都是从原始数据中提取的数字?
感谢。
答案 0 :(得分:3)
没有必要为此使用流媒体。猪可以处理它。使用内置UDF REGEX_EXTRACT
:
$ cat record.txt
f1 f2 M2534896R402Qnew f4
f1 f2 M2534896R987Qxyz f4
f1 f2 M2534897R421Qabc f4
f1 f2 M47Rzxcvzxcv f4
f1 f2 12345M000R f4
f1 f2 M23551Qnew f4
f1 f2 M298793R133R23Qnew f4
$ cat test.pig
raw = load 'record.txt' using PigStorage('\t') as (f1:chararray, f2:chararray, f3:chararray, f4:chararray);
ext = FOREACH raw GENERATE REGEX_EXTRACT(f3, 'M(\\d+)R', 1) AS num;
DUMP ext;
$ pig -x local test.pig
(2534896)
(2534896)
(2534897)
(47)
(000)
()
(298793)
请注意REGEX_EXTRACT
的结果是chararray
。如果你想要int
,你必须投射它。