首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >猪农业功能

猪农业功能
EN

Stack Overflow用户
提问于 2014-07-13 12:40:35
回答 2查看 87关注 0票数 0

我的输入文件如下

代码语言:javascript
复制
a,t1,1000,100
a,t1,2000,200
b,t2,1000,200
b,t2,5000,100

如何在上面的文件中找到不同的$0的计数。

myinput = LOAD 'file‘AS(a1:chararray,a2:chararray,amt:int,rate:int);

在上面的脚本之后,需要做些什么。另外,我可以用这个不同的计数来除以另一个关系吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-14 09:19:22

首先,读取数据的方式是不正确的。如果您尝试转储"myinput",您将看到整个行在第一个字段(a1)中读取,而其他行是空的。原因是您没有指定一个LOAD函数,默认函数是PigStorage()内置函数,它期望使用选项卡分隔的文件(因此它忽略您的逗号!).You需要通过using子句显式指定一个load函数(例如PigStorage())并传递它参数:

代码语言:javascript
复制
myInput = LOAD file' using PigStorage(',');
myInput2 = FOREACH myInput GENERATE $0 as (a1:chararray), $1 as (a2:chararray), $2 as (amt:int), $3 as (rate:int);

接下来,要首先找到不同的$0,您必须在一个单独的关系中提取字段$0。原因是DISTINCT语句在整个记录上工作,而不是在单独的字段上工作。

代码语言:javascript
复制
myField = FOREACH myInput2 GENERATE a1;
distinctA1 = DISTINCT myField;

现在distinctA1的结果是{(a),(b)}。通过使用now group ,您将把所有记录组合在一起,剩下的就是计数它们:

代码语言:javascript
复制
grouped = GROUP distinctA1 all;
countA1 = FOREACH grouped GENERATE COUNT(distinctA1);

现在你很开心。*完整的守则:

代码语言:javascript
复制
myInput = LOAD 'file' using PigStorage(',');
myInput2 = FOREACH myInput GENERATE $0 as (a1:chararray), $1 as (a2:chararray), $2 as    (amt:int), $3 as (rate:int);
a1 = FOREACH myInput2 GENERATE a1;
distinctA1 = DISTINCT a1;
grouped = GROUP distinctA1 all;
countA1 = FOREACH grouped GENERATE COUNT(distinctA1);
票数 3
EN

Stack Overflow用户

发布于 2014-07-14 15:54:48

你可以这样做:

代码语言:javascript
复制
myInput = LOAD 'file.txt' USING PigStorage(',') AS (a1:chararray,a2:chararray,amt:int,rate:int);
Data = GROUP myInput BY $0;
Data = FOREACH Data GENERATE $0;
Data = GROUP Data ALL;
Data = FOREACH Data GENERATE $0,COUNT($1);

注:通过对$0进行分组,您所做的事情与不同的一样,而且性能更好;)

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

https://stackoverflow.com/questions/24722797

复制
相关文章

相似问题

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