在正则表达式的猪分裂线

时间:2013-05-22 16:05:30

标签: regex hadoop apache-pig

我正在尝试编写一个PIG脚本,该脚本读入一个大的单行文件并将其拆分为一个大的多行文件。当我找到字符串“alert”或“none”时,我正试图拆分文本;

我的脚本是:

data = LOAD '/myfile' USING TextLoader() as (line:chararray);
data_split = FOREACH data GENERATE FLATTEN (STRSPLIT(line, '/none|alert/')) as line:chararray);

为了验证我已正确拆分,我使用以下方法生成计数:

x = GROUP data_split by line; 
count = foreach x GENERATE COUNT(data_split);
dump count;

这总是返回1,这可能是因为我没有正确地拆分它。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

如果您尝试按照我的想法行事,那么您的正则表达式语法是不正确的。

Pig使用标准的Java正则表达式语法。看看这个:http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

我相信您正在寻找STRSPLIT(line, '(none|alert)')

此外,您脚本的其余部分无法执行您想要的操作。 STRSPLIT返回一个元组,当你FLATTEN一个元组时,它不会将字段分配到多行,就像你FLATTEN一个包那样。相反,您最终获得了多个字段,而您恰好正在命名line中的第一个字段。

除非你事先知道元组中的字段数量,否则你会得到(在这种情况下,请查看this answer),或者除非结果字符串不包含任何字符,如空格,逗号,等等(在这种情况下,您可以使用this method),最好的办法是编写一个自定义UDF来替换其输入记录分隔符是您特殊字符序列的TextLoader()

相关问题