我被困在 Pig 中的字符串解析上。
我查看了周围的文档regex_extract
,regex_extract_all
并希望使用其中一个功能。
我有文件'/logs/test.log'
:
cat '/logs/test.log'
user=242562&friend=6226&friend=93856&age=35&friend=35900
我想friend
从 url 中提取标签,在这种情况下,我有 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'
或类似的东西,但想看看是否有人知道一个好的正则表达式方法。