Apache pig 用pig拉丁语计算结果行

Apache pig 用pig拉丁语计算结果行,apache-pig,Apache Pig,我尝试用pig拉丁语运行简单的单词计数器,如下所示: lines = LOAD 'SOME_FILES' using PigStorage('#') as (line:chararray); word = FILTER lines BY (line matches '.*SOME_VALUE.*'); 我想计算在搜索一些\u文件时找到的一些\u值的数量,因此预期的输出应该如下所示: (SOME_VALUE,xxxx) B = FOREACH lines GENERATE FLATTEN(TO

我尝试用pig拉丁语运行简单的单词计数器,如下所示:

lines = LOAD 'SOME_FILES' using PigStorage('#') as (line:chararray);
word = FILTER lines BY (line matches '.*SOME_VALUE.*');
我想计算在搜索
一些\u文件时找到的
一些\u值
的数量,因此预期的输出应该如下所示:

(SOME_VALUE,xxxx)
B = FOREACH lines GENERATE FLATTEN(TOKENIZE(line)) ;
C = GROUP B BY $0 ;
D = FOREACH C GENERATE group AS word, COUNT(B) AS count ;
其中
xxxx
,是找到的
某些值的总数


如何搜索多个值并按上述方式打印每一个值?

您应该做的是将每一行分割成一袋令牌,然后将其展平。然后,您可以对单词进行
分组
,将每个单词的所有匹配项都拉到它自己的行中。一旦您对生成的包进行
计数
,您将获得文档中所有单词的总计数

这将类似于:

(SOME_VALUE,xxxx)
B = FOREACH lines GENERATE FLATTEN(TOKENIZE(line)) ;
C = GROUP B BY $0 ;
D = FOREACH C GENERATE group AS word, COUNT(B) AS count ;
如果您不确定每个步骤都在做什么,那么可以使用
description
DUMP
来帮助可视化正在发生的事情


更新:如果要过滤结果以仅包含所需的两个字符串,可以执行以下操作:

E = FILTER D BY (word == 'foo') OR 
                (word == 'bar') OR 
                (word == 'etc') ;

-- Another way...
E = FILTER D BY (word matches 'foo|bar|etc') ;

但是,您也可以在
B
C
之间执行此操作,这样您就不必对不需要的
进行计数了。

您的意思是什么?是否只希望在输出中看到特定的字符串集?