我对猪非常不熟悉,我想尝试制作一个没有标点符号的排序字数。我可以DUMP D就好了,当我尝试使用DUMP E并出现此错误时,问题就出现了。
[main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1066: Unable to open iterator for alias E
A = load './SherlockHolmes.txt' using PigStorage(' ');
B = foreach A generate FLATTEN(REGEX_EXTRACT_ALL(LOWER((chararray)$0),'([A-Za-z]+)')) as word;
C = group B by word;
D = foreach C generate COUNT(B) AS counts, group AS word;
E = ORDER D BY counts DESC;
DUMP E;
我做错了什么?
答案 0 :(得分:3)
对于这个答案,我将使用它作为我的样本输入:
Hello, my ;name is Holmes.
This is a test, of a question on SO.
Holmes, again.
当我第一次编写脚本时,我发现DESCRIBE
和DUMP
每个步骤都有一些示例数据非常有用,所以我确切地知道发生了什么。使用您的脚本执行此操作会显示:
A = load './SherlockHolmes.txt' using PigStorage(' ');
-- Schema for A unknown.
-- (Hello,,my,name,is,Holmes.)
-- (This,is,a,test,,of,a,question,on,SO.)
-- (Holmes,,again.)
因此A
的输出是一个'元组'(实际上它是一个模式),其值不明。通常,如果您不知道元组中的值如何,则应使用bag代替。
B = foreach A generate FLATTEN(REGEX_EXTRACT_ALL(LOWER((chararray)$0),'([A-Za-z]+)')) as word;
-- B: {word: bytearray}
-- ()
-- (this)
-- ()
当您使用$0
时,您指的不是模式中的所有单词,而是第一个单词。因此,您只需将LOWER
和REGEX_EXTRACT_ALL
应用于第一个单词。另请注意,FLATTEN
运算符正在元组上完成,但不会产生所需的输出。你想要FLATTEN
一个包。
C
,D
和E
都可以按预期工作,所以关于按摩数据以获得他们可以使用的格式。
知道这一点,你可以这样做:
-- Load in the line as a chararray so that TOKENIZE can convert it into a bag
A = load './tests/sh.txt' AS (foo:chararray);
B1 = FOREACH A GENERATE TOKENIZE(foo, ' ') AS tokens: {T:(word: chararray)} ;
-- Output from B1:
-- B1: {tokens: {T: (word: chararray)}}
-- ({(Hello,),(my),(;name),(is),(Holmes.)})
-- ({(This),(is),(a),(test,),(of),(a),(question),(on),(SO.)})
-- ({(Holmes,),(again.)})
-- Now inside a nested FOREACH we apply the appropriate transformations.
B2 = FOREACH B1 {
-- Inside a nested FOREACH you can go over the contents of a bag
cleaned = FOREACH tokens GENERATE
-- The .*? are needed to capture the leading and trailing punc.
FLATTEN(REGEX_EXTRACT_ALL(LOWER(word),'.*?([a-z]+).*?')) as word ;
-- Cleaned is a bag, so when we FLATTEN it we get one word per line
GENERATE FLATTEN(cleaned) ;
}
所以现在B2
的输出是:
B2: {cleaned::word: bytearray}
(hello)
(my)
(name)
(is)
(holmes)
(this)
(is)
(a)
(test)
(of)
(a)
(question)
(on)
(so)
(holmes)
(again)
当输入C
,D
和E
时,会提供所需的输出。
如果您需要我澄清任何事情,请告诉我。