我正在尝试在猪拉丁语中运行简单的单词计数器,如下所示:
lines = LOAD 'SOME_FILES' using PigStorage('#') as (line:chararray);
word = FILTER lines BY (line matches '.*SOME_VALUE.*');
我想要计算搜索SOME_VALUE
的{{1}}个搜索次数,因此预期的输出应该是这样的:
SOME_FILES
(SOME_VALUE,xxxx)
的位置,是xxxx
找到的总数。
如何搜索多个值并按上述方式打印每个值?
答案 0 :(得分:1)
你应该做的是将每一行分成一包代币,然后FLATTEN
。然后,您可以对单词执行GROUP
,将每个单词的所有出现都放入其自己的行中。完成所得包的COUNT
后,您将获得文档中所有单词的总计数。
这看起来像是:
B = FOREACH lines GENERATE FLATTEN(TOKENIZE(line)) ;
C = GROUP B BY $0 ;
D = FOREACH C GENERATE group AS word, COUNT(B) AS count ;
如果您不确定每个步骤的作用,那么您可以使用DESCRIBE
和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
之间执行此操作,这样您就不会执行任何您不需要的COUNT
。