gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:42:45 25 4
gpt4 key购买 nike

我被困在 Pig 中的字符串解析上。

我查看了有关 regex_extractregex_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)

这似乎可行,但我真的只想提取 friend - (6226,93856,35900)。我也遇到过每个用户可能有多于或少于 3 个 friend 的情况。

有什么想法吗?

还考虑使用类似 FLATTEN(TOKENIZE($0,'&')) 的方法,然后以某种方式仅过滤 SUBSTRING($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)

关于regex - pig - 使用正则表达式解析字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14132175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com