Regex pig-使用正则表达式解析字符串

Regex pig-使用正则表达式解析字符串,regex,apache-pig,Regex,Apache Pig,我在Pig中陷入了字符串解析 我已经阅读了有关regex\u extract和regex\u extract\u all的文档,并希望使用其中一个函数 我有文件'/logs/test.log': cat '/logs/test.log' user=242562&friend=6226&friend=93856&age=35&friend=35900 我想从url中提取friend标记,在本例中,我有3个相同的标记regex\u extract似乎只适用于第一个实

我在Pig中陷入了字符串解析

我已经阅读了有关
regex\u extract
regex\u extract\u all
的文档,并希望使用其中一个函数

我有文件
'/logs/test.log'

cat '/logs/test.log'
user=242562&friend=6226&friend=93856&age=35&friend=35900
我想从url中提取
friend
标记,在本例中,我有3个相同的标记
regex\u extract
似乎只适用于第一个实例,这是我所期望的,而对于
regex\u extract\u all
,似乎我已经知道了整个字符串模式,它在源文件的每一行上都会发生变化

使用
regex\u extract
看起来还可以,但是这个选项只提供了第一个选项

 [root@test]# pig -x local
 A = LOAD './test.log';
 B = FOREACH A GENERATE REGEX_EXTRACT($0, 'friend=([0-9]*)',1);
 dump B;
 (6226)
我看到的
regex\u extract\u all
示例显示了查找所有标记的regex:

  B = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL($0, 'user=([0-9]+?)&friend=([0-9]+?)&friend=([0-9]+?)&.+?'));
 dump B;
 (242562,6226,93856)
这似乎有效,但我真的只想提取朋友-(62269385635900)。我也有这样的情况,每个用户可能有多于或少于3个朋友

有什么想法吗


还考虑使用类似于
flatte(TOKENIZE($0,&')
,然后以某种方式只对
子字符串($0,0,INDEXOF($0,'='))=='friend'
或类似的内容进行过滤,但想看看是否有人知道一种好的正则表达式方法。

这可以通过简单的字符串操作实现:

inputs = LOAD 'input' AS (line: chararray);
tokenized = FOREACH inputs GENERATE FLATTEN(TOKENIZE(line, '&')) AS parameter;
filtered = FILTER tokenized BY INDEXOF(parameter, 'friend=') != -1;
result = FOREACH filtered GENERATE SUBSTRING(parameter, 7, (int)SIZE(parameter)) AS   friend_number;
DESCRIBE tokenized;
DUMP tokenized;
DESCRIBE filtered;
DUMP filtered;
DESCRIBE result;
DUMP result;
结果:

tokenized: {parameter: chararray}
(user=242562)
(friend=6226)
(friend=93856)
(age=35)
(friend=35900)
filtered: {parameter: chararray}
(friend=6226)
(friend=93856)
(friend=35900)
result: {friend_number: chararray}
(6226)
(93856)
(35900)
试试这个:

a = LOAD '/logs/test.log' USING PigStorage('&') as (f1, f2, f3, f4, f5);
b = FOREACH a GENERATE REGEX_EXTRACT(f2,'friend=([0-9]*)', 1), 
                       REGEX_EXTRACT(f3,'friend=([0-9]*)', 1),
                       REGEX_EXTRACT(f5,'friend=([0-9]*)', 1);
DUMP b;

有点放弃了这一点,只是使用流来快速编写脚本。不想再维护另一个脚本,但要快得多的解决方案。后悔花了这么多时间让它在本地工作