如何在Pig中使用REGEX_EXTRACT_ALL

时间:2015-12-28 10:50:10

标签: regex apache-pig

这是我的样本数据

subId=00001111911128052627,towerid=11232w34532543456345623453456984756894756,bytes=122112212212212218.4621702216543667E17
subId=00001111911128052639,towerid=11232w34532543456345623453456984756894756,bytes=122112212212212219.6726312167218586E17
subId=00001111911128052615,towerid=11232w34532543456345623453456984756894756,bytes=122112212212212216.9431647633139046E17

我的预期输出将是一个元组,其中每个字段代表一个匹配的组:

  

(capture_group1,capturing_group2,...,capture_groupN)

     

例如(00001111911128052627,11232w34532543456345623453456984756894756,122112212212212216.9431647633139046E17)

这是我的方法,

A = load '/home/hduser/Desktop/arrtest1.txt' using TextLoader as (line:chararray);
b = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL(line,'(.*)[subId=](.*)[towerid=](.*)[bytes=](.*)')) AS (F1,F2,F3);

但我没有得到我的结果。

1 个答案:

答案 0 :(得分:0)

根据您的输入示例,您可以尝试使用此正则表达式:

REGEX_EXTRACT_ALL(line,'subId=([^,]*),towerid=([^,]*),bytes=(.*)')

您可以检查此正则表达式at this link的行为。

更新:为什么不使用.*来检查字段?

kleene运算符*的默认贪婪性质导致正则表达式引擎匹配到字符串结尾,然后每次返回一个字符并检查正则表达式的下一部分是否匹配(例如在第一个,之后搜索逗号.*

所以最后下面的所有正则表达式都匹配但是有不同的步骤来完成这个过程:

[a-zA-Z]+=(.*),[a-zA-Z]+=(.*),[a-zA-Z]+=(.*) - 1142 steps

subId=([^,]*),towerid=([^,]*),bytes=(.*) - 96 steps

如果你不关心字段名称,你想要纯字母字段(大写或小写):

(?i)[a-z]+=([^,]*)[a-z,]+=([^,]*),[a-z,]+=(.*) - 58 steps

NB :Apache Pig正则表达式引擎基于Java,因此不区分大小写的标志(?i)也可能有效。