我在Pig的字符串解析方面卡住了。
我已经查看了regex_extract
和regex_extract_all
相关的文档,并希望使用其中一个函数。
我有文件'/logs/test.log'
:
cat '/logs/test.log'
user=242562&friend=6226&friend=93856&age=35&friend=35900
我想从url中提取
friend
标签,在这种情况下,我有3个相同的标签。regex_extract
似乎只适用于第一个实例,这是我预期的,对于regex_extract_all
,似乎我必须知道整个字符串模式,而此模式在源文件的每一行上都会改变。使用
regex_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_extract_all
的示例都是在正则表达式中寻找所有标签:
B = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL($0, 'user=([0-9]+?)&friend=([0-9]+?)&friend=([0-9]+?)&.+?'));
dump B;
(242562,6226,93856)
那似乎可以解决问题,但我只想提取好友 - (6226,93856,35900)。我还有一些情况,每个用户可能有多于或少于3个好友。
有什么想法吗?
同时考虑使用类似
FLATTEN(TOKENIZE($0,'&'))
的东西,然后在SUBSTRING($0,0,INDEXOF($0,'=')) == 'friend'
上进行过滤,或者类似这样的东西,但想知道是否有一个好的正则表达式方法。