0

我正在尝试编写一个读取大型单行文件并将其拆分为大型多行文件的 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,这可能是因为我没有正确拆分它。任何帮助是极大的赞赏。

4

1 回答 1

0

如果您尝试做我认为的事情,那么您的正则表达式语法不正确。

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

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

此外,您的脚本的其余部分并没有按照您的意愿行事。 STRSPLIT返回一个元组,当你FLATTEN是一个元组时,它不会将字段分配到多行,就像你FLATTEN一个包时发生的那样。相反,您最终会获得多个字段,而您恰好将其中的第一个命名为line.

除非您提前知道元组中的字段数量(在这种情况下,请查看此答案),或者除非您生成的字符串不包含任何字符,如空格、逗号等(其中在这种情况下,您可以使用这种方法),您最好的选择可能是编写一个自定义 UDF 来替换TextLoader()其输入记录分隔符是您的特殊字符序列。

于 2013-05-22T17:01:35.203 回答