0

我正在使用 PIG 生成最近访问过的 URL 列表。在每个 URL 中,都有一串数字代表访问的产品页面。我正在尝试使用一个regex_extract_all()函数来仅提取长度为 6-8 的数字字符串。数字串可以直接在后面找到jobs2/view/,通常以 . 结尾,+&cd但有时也可能以 . 结尾)

以下是一些示例 URL:

( http://a.com/search?q=cache:QD7vZRHkPQoJ:ca.xyz.com/jobs2/view/17069404+&cd=1&hl=en&ct=clnk&gl=ca ) ( http://a.com/search? q=cache:G9323j2oNbAJ:ca.xyz.com/jobs2/view/5977065+&cd=1&hl=en&ct=clnk&gl=ca ) ( http://a.com/search?q=cache:aNspmG11qAJ:hk.xyz.com /jobs2/view/16988928+&cd=2&hl=zh-TW&ct=clnk&gl=hk ) ( http://a.com/search?q=cache:aNspmG11AJ:hk.xyz.com/jobs2/view/16988928+&cd= 2&hl=zh-TW&ct=clnk&gl=hk ) ( http://a.com/search?q=cache:aNspmG11qAJ:hk.xyz.com/jobs2/view/16988928+&cd=2&hl=zh-TW&ct=cl k&gl=香港)

这是我正在使用的当前正则表达式:

J = FOREACH jpage GENERATE FLATTEN(REGEX_EXTRACT_ALL(TEXTCOLUMN, '\/view\/(\d+)\+\&')) as (output:chararray)

我也尝试过其他形式,例如:

'[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]', 'view.([0-9]+)', 'view\/([\d]+)\+',

'[0-9][0-9][0-9]+', 和 '[0-9][0-9][0-9]*'; 这些都不起作用。

任何人都可以在这里提供帮助或有其他方法吗?

非常感谢,MM

4

2 回答 2

1

“意外字符'D'”的原因是,您需要放置双反斜杠而不是单反斜杠。例如,只需将 [\d+] 替换为 [\\d+]

这是您的解决方案,请验证您的所有输入字符串

input.txt
http://a.com/search?q=cache:QD7vZRHkPQoJ:ca.xyz.com/jobs2/view/17069404+&cd=1&hl=en&ct=clnk&gl=ca  
http://a.com/search?q=cache:G9323j2oNbAJ:ca.xyz.com/jobs2/view/5977065+&cd=1&hl=en&ct=clnk&gl=ca  
http://a.com/search?q=cache:aNspmG11qAJ:hk.xyz.com/jobs2/view/16988928+&cd=2&hl=zh-TW&ct=clnk&gl=hk  
http://a.com/search?q=cache:aNspmG11AJ:hk.xyz.com/jobs2/view/16988928+&cd=2&hl=zh-TW&ct=clnk&gl=hk  
http://a.com/search?q=cache:aNspmG11qAJ:hk.xyz.com/jobs2/view/16988928+&cd=2&hl=zh-TW&ct=clk&gl=hk  
http://a.com/search?q=cache:aNspmG11qAJ:hk.xyz.com/jobs2/view/16988928)=2&hl=zh-TW&ct=clk&gl=hk  
http://webcache.googleusercontent.com/search?q=cache:http://my.linkedin.com/jobs2/view/9919248

Updated Pigscript:
A = LOAD 'input.txt' as line;
B = FOREACH A GENERATE REGEX_EXTRACT(line,'.*/view/(\\d+)([+|&|cd|)?]+)?',1);
dump B;

(17069404)
(5977065)
(16988928)
(16988928)
(16988928)
(16988928)

于 2014-09-20T03:15:48.463 回答
0

我对 PIG 不熟悉,但这个正则表达式将匹配您的目标:

(?<=/jobs2/view/)\d+

通过使用(非消耗)看后面,整个比赛(不仅仅是一比赛)就是你的号码。

于 2014-09-19T21:31:10.543 回答