Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache pig 我的wordcount程序到底出了什么问题?(猪)_Apache Pig - Fatal编程技术网

Apache pig 我的wordcount程序到底出了什么问题?(猪)

Apache pig 我的wordcount程序到底出了什么问题?(猪),apache-pig,Apache Pig,我对pig非常不熟悉,我想尝试对不带标点符号的单词进行排序计数。我可以很好地转储D,当我尝试转储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(RE

我对pig非常不熟悉,我想尝试对不带标点符号的单词进行排序计数。我可以很好地转储D,当我尝试转储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;

我做错了什么?

对于这个答案,我将使用它作为示例输入:

Hello, my ;name is Holmes.                                                       
This is a test, of a question on SO.                                            
Holmes, again.
当我第一次编写脚本时,我发现使用一些示例数据对每个步骤都非常有用,这样我就可以确切地知道发生了什么。使用脚本执行此操作将显示:

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
的输出是一个具有未知数量值的“tuple”(实际上是一个模式)。通常,如果您不知道元组中的may值是如何存在的,那么应该使用

当您使用
$0
时,您指的不是架构中的所有单词,而是第一个单词。因此,您只对第一个单词应用
LOWER
REGEX\u EXTRACT\u ALL
。另外,请注意,运算符是在元组上执行的,不会生成所需的输出。你想把一个包展平

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
时,将产生所需的输出


如果您需要我澄清任何问题,请告诉我。

对于此答案,我将使用此作为示例输入:

Hello, my ;name is Holmes.                                                       
This is a test, of a question on SO.                                            
Holmes, again.
当我第一次编写脚本时,我发现使用一些示例数据对每个步骤都非常有用,这样我就可以确切地知道发生了什么。使用脚本执行此操作将显示:

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
的输出是一个具有未知数量值的“tuple”(实际上是一个模式)。通常,如果您不知道元组中的may值是如何存在的,那么应该使用

当您使用
$0
时,您指的不是架构中的所有单词,而是第一个单词。因此,您只对第一个单词应用
LOWER
REGEX\u EXTRACT\u ALL
。另外,请注意,运算符是在元组上执行的,不会生成所需的输出。你想把一个包展平

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
时,将产生所需的输出


如果您需要我澄清任何事情,请告诉我。

您使用的是什么版本的pig?我刚刚在版本0.10中尝试了这个,它成功了,但输出不正确。对于在这里查找此帖子的人来说,这是一个。你使用的是什么版本的pig?我刚刚在版本0.10中尝试了这个,它成功了,但输出不正确。对于那些在这里查找此帖子的人来说,这里是一个。这里我认为pig应该更简单:PAnyway谢谢你的帮助。。。对于另一个问题,我真的不会意识到所有这些类似的问题,为什么这个问题拒绝排序?grunt>描述C:{count:long,group:chararray}你是指
E
的输出吗?对我来说,
E
的输出是按降序排序的,所以我不太确定。我能想到的唯一一件事是,
计数
被当作一个字符而不是一个长/int。在这里,我认为pig应该更简单:PAnyway谢谢你的帮助。。。对于另一个问题,我真的不会意识到所有这些类似的问题,为什么这个问题拒绝排序?grunt>描述C:{count:long,group:chararray}你是指
E
的输出吗?对我来说,
E
的输出是按降序排序的,所以我不太确定。我脑海中唯一能想到的是,
计数
被视为字符而不是长/整数。