我的输入文件如下
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);
在上面的脚本之后,需要做些什么。另外,我可以用这个不同的计数来除以另一个关系吗?
发布于 2014-07-14 09:19:22
首先,读取数据的方式是不正确的。如果您尝试转储"myinput",您将看到整个行在第一个字段(a1)中读取,而其他行是空的。原因是您没有指定一个LOAD函数,默认函数是PigStorage()内置函数,它期望使用选项卡分隔的文件(因此它忽略您的逗号!).You需要通过using子句显式指定一个load函数(例如PigStorage())并传递它参数:
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语句在整个记录上工作,而不是在单独的字段上工作。
myField = FOREACH myInput2 GENERATE a1;
distinctA1 = DISTINCT myField;现在distinctA1的结果是{(a),(b)}。通过使用now group ,您将把所有记录组合在一起,剩下的就是计数它们:
grouped = GROUP distinctA1 all;
countA1 = FOREACH grouped GENERATE COUNT(distinctA1);现在你很开心。*完整的守则:
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);发布于 2014-07-14 15:54:48
你可以这样做:
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进行分组,您所做的事情与不同的一样,而且性能更好;)
https://stackoverflow.com/questions/24722797
复制相似问题