【发布时间】:2015-01-10 01:22:48
【问题描述】:
如何编写 PIG 查询来获取字段中值的存在次数?
例如:
字段 A |字段B
20|ABC;
21|XYZ;
25|空;
99|WER;
45|空;
89|FOY;
必需的 O/P :字段 A 的计数 = 6,字段 B 的计数 = 4
【问题讨论】:
标签: mapreduce apache-pig
如何编写 PIG 查询来获取字段中值的存在次数?
例如:
字段 A |字段B
20|ABC;
21|XYZ;
25|空;
99|WER;
45|空;
89|FOY;
必需的 O/P :字段 A 的计数 = 6,字段 B 的计数 = 4
【问题讨论】:
标签: mapreduce apache-pig
Pig 不会将上述输入视为null,它基本上是chararray,因此所有内置函数(is null, is not null)在这种情况下都不起作用。您需要对所有字段进行分组,过滤掉空值并获取计数。你可以试试下面的脚本吗?
输入
20|ABC;
21|XYZ;
25|null;
99|WER;
45|null;
89|FOY;
PigScript:
A = LOAD 'input' USING PigStorage('|') AS (f1:int,f2:chararray);
B = GROUP A ALL;
C = FOREACH B {
filterNull = FILTER A BY (f2!='null;');
GENERATE COUNT(A.f1) AS fieldA, COUNT(filterNull.f2) AS fieldB;
}
DUMP C;
输出:
(6,4)
【讨论】:
请找到要遵循的步骤以获取输出
fieldcount = load '/user/examples/stackoverflow/count.txt' using PigStorage('|') as (a:int, b:chararray);
fieldcount1 = FOREACH fieldcount GENERATE a, REPLACE(b,';','') as b;
fieldcount2 = GROUP fieldcount1 ALL;
fieldcount3 = FOREACH fieldcount2 {
a_cnt = FILTER fieldcount1 BY a is not null;
b_cnt = FILTER fieldcount1 BY b is not null and b != 'null' ;
GENERATE COUNT(a_cnt) as a_count, COUNT(b_cnt) as b_count;
}
【讨论】:
请找出答案:- 我的样本数据是
003 Amit Delhi India 12000
004 Anil Delhi India 15000
005 Deepak Delhi India 34000
006 Fahed Agra India 45000
007 Ravi Patna India 98777
008 Avinash Punjab India 120000
009 Saajan Punjab India 54000
001 Harit Delhi India 20000
002 Hardy Agra India 20000
011 Banglore
全部用空格隔开
代码如下:-
A = load '/edata' using PigStorage(' ') as (eid:int,name:chararray,city:chararray,country:chararray,salary:int);
s = group A ALL ;
result = foreach s generate COUNT(A.eid),COUNT(A.name),COUNT(A.country),COUNT(A.salary);
dump result ;
你会得到以下结果:-
(10,9,9,9)
【讨论】:
输入:
20|ABC
21|XYZ
25|null
99|WER
45|null
89|FOY
脚本:
inputData = LOAD 'input' using PigStorage('|');
grouped_input = GROUP inputData ALL;
counts = FOREACH grouped_input GENERATE COUNT($1), COUNT($2);
dump counts;
【讨论】: