我被困在 Pig 中的字符串解析上。
我查看了周围的文档regex_extract
and 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'
或类似的东西,但想看看是否有人知道一个好的正则表达式方法。