首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的字数程序到底做错了什么?(猪)

我的字数程序到底做错了什么?(猪)
EN

Stack Overflow用户
提问于 2013-07-30 15:34:55
回答 1查看 1.3K关注 0票数 0

我对猪很陌生,我想试着用一个没有标点符号的排序词来计数。我可以转储D,当我尝试转储E并得到这个错误时,问题就出现了。

代码语言:javascript
复制
[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;

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-30 18:46:02

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

代码语言:javascript
复制
Hello, my ;name is Holmes.                                                       
This is a test, of a question on SO.                                            
Holmes, again.

当我第一次编写脚本时,我发现DESCRIBEDUMP每一步都有一些示例数据,这样我就能确切地知道发生了什么。使用脚本执行此操作将显示:

代码语言:javascript
复制
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”(实际上是一个模式),其值数目未知。通常,如果您不知道在元组中可能值是如何存在的,则应该使用袋子

代码语言:javascript
复制
B = foreach A generate FLATTEN(REGEX_EXTRACT_ALL(LOWER((chararray)$0),'([A-Za-z]+)')) as word;
-- B: {word: bytearray}
-- ()
-- (this)
-- ()

在使用$0时,不是指架构中的所有单词,而是指第一个单词。因此,您只将LOWERREGEX_EXTRACT_ALL应用于第一个单词。另外,请注意,FLATTEN运算符是在元组上执行的,它不会产生所需的输出。你想FLATTEN一个袋子。

CDE都应该像您所期望的那样工作,所以所有这些都是为了将数据转换成他们可以使用的格式。

知道了这一点,你就可以这样做:

代码语言:javascript
复制
-- 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的输出是:

代码语言:javascript
复制
B2: {cleaned::word: bytearray}
(hello)
(my)
(name)
(is)
(holmes)
(this)
(is)
(a)
(test)
(of)
(a)
(question)
(on)
(so)
(holmes)
(again)

当输入到CDE中时,将提供所需的输出。

如果你需要我澄清什么,请告诉我。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17951375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档