将 PIG 与 Hadoop 结合使用,如何通过正则表达式将部分文本与未知数量的组进行匹配?
我正在使用亚马逊的弹性地图缩减。
我的日志文件看起来像这样
random text foo="1" more random text foo="2"
more text notamatch="5" noise foo="1"
blah blah blah foo="1" blah blah foo="3" blah blah foo="4" ...
如何编写一个 pig 表达式来挑选“foo”表达式中的所有数字?
我更喜欢看起来像这样的元组:
(1,2)
(1)
(1,3,4)
我尝试了以下操作:
TUPLES = foreach LINES generate FLATTEN(EXTRACT(line,'foo="([0-9]+)"'));
但这只会产生每行中的第一个匹配项:
(1)
(1)
(1)
I'm using Amazon's elastic map reduce.
I have log files that look something like this
random text foo="1" more random text foo="2"
more text notamatch="5" noise foo="1"
blah blah blah foo="1" blah blah foo="3" blah blah foo="4" ...
How can I write a pig expression to pick out all the numbers in the 'foo' expressions?
I prefer tuples that look something like this:
(1,2)
(1)
(1,3,4)
I've tried the following:
TUPLES = foreach LINES generate FLATTEN(EXTRACT(line,'foo="([0-9]+)"'));
But this yields only the first match in each line:
(1)
(1)
(1)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您可以使用
STRSPLIT
:http://pig .apache.org/docs/r0.8.0/piglatin_ref2.html#STRSPLIT要分割的正则表达式为
[^0-9]+
(即不是数字)这将有效地分割大部分非数字,只留下数字标记。
另一种选择是编写 Pig UDF。
You could use
STRSPLIT
: http://pig.apache.org/docs/r0.8.0/piglatin_ref2.html#STRSPLITThe regex to split on would be
[^0-9]+
(i.e., not numbers)This will effectively split on large portions of non-numbers, leaving only tokens of numerical digits.
Another option would be to write a Pig UDF.
REGEX_EXTRACT 函数可以帮助您获得所需的输出
REGEX_EXTRACT(input, 'foo=(.*)',2) AS input;
REGEX_EXTRACT function may help you to get your desired output
REGEX_EXTRACT(input, 'foo=(.*)',2) AS input;