我正在尝试编写一个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,这可能是因为我没有正确地拆分它。非常感谢任何帮助。
答案 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()
。