pig-用regex解析字符串

6ioyuze2  于 2021-06-24  发布在  Pig
关注(0)|答案(2)|浏览(319)

我在pig中被字符串解析卡住了。
我看了周围的文件 regex_extract 以及 regex_extract_all 并希望使用其中一个功能。
我有档案 '/logs/test.log' :

cat '/logs/test.log'
user=242562&friend=6226&friend=93856&age=35&friend=35900

我想提取 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 在查找所有标记的地方显示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个朋友。
有什么想法吗?
同时考虑使用 FLATTEN(TOKENIZE($0,'&')) 然后不知何故只在屏幕上过滤 SUBSTRING($0,0,INDEXOF($0,'=')) == 'friend' 或者类似的,但是想看看是否有人知道一个好的regex方法。

ne5o7dgx

ne5o7dgx1#

试试这个:

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;
xdnvmnnf

xdnvmnnf2#

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

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)

相关问题